home *** CD-ROM | disk | FTP | other *** search
/ Sprite 1984 - 1993 / Sprite 1984 - 1993.iso / src / cmds / gdb-4.5 / dist / bfd / coffcode.h < prev    next >
Encoding:
Text File  |  1992-04-02  |  106.0 KB  |  3,920 lines

  1. /* Support for the generic parts of most COFF variants, for BFD.
  2.    Copyright (C) 1990-1991 Free Software Foundation, Inc.
  3.    Written by Cygnus Support.
  4.  
  5. This file is part of BFD, the Binary File Descriptor library.
  6.  
  7. This program is free software; you can redistribute it and/or modify
  8. it under the terms of the GNU General Public License as published by
  9. the Free Software Foundation; either version 2 of the License, or
  10. (at your option) any later version.
  11.  
  12. This program is distributed in the hope that it will be useful,
  13. but WITHOUT ANY WARRANTY; without even the implied warranty of
  14. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  15. GNU General Public License for more details.
  16.  
  17. You should have received a copy of the GNU General Public License
  18. along with this program; if not, write to the Free Software
  19. Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.  */
  20.  
  21. /* 
  22. Most of this hacked by  Steve Chamberlain,
  23.             sac@cygnus.com 
  24. */
  25. /*
  26.  
  27. SECTION
  28.     coff backends
  29.  
  30.     BFD supports a number of different flavours of coff format.
  31.     The major difference between formats are the sizes and
  32.     alignments of fields in structures on disk, and the occasional
  33.     extra field.  
  34.  
  35.     Coff in all its varieties is implimented with a few common
  36.     files and a number of implementation specific files. For
  37.     example, The 88k bcs coff format is implemented in the file
  38.     @code{coff-m88k.c}. This file @code{#include}s
  39.     @code{coff-m88k.h} which defines the external structure of the
  40.     coff format for the 88k, and @code{internalcoff.h} which
  41.     defines the internal structure. @code{coff-m88k.c} also
  42.     defines pthe relocations used by the 88k format
  43.     @xref{Relocations}. Then the major portion of coff code is
  44.     included (@code{coffcode.h}) which defines the methods used to
  45.     act upon the types defined in @code{coff-m88k.h} and
  46.     @code{internalcoff.h}.
  47.  
  48.  
  49.     The Intel i960 processor version of coff is implemented in
  50.     @code{coff-i960.c}. This file has the same structure as
  51.     @code{coff-m88k.c}, except that it includes @code{coff-i960.h}
  52.     rather than @code{coff-m88k.h}. 
  53.  
  54. SUBSECTION
  55.     Porting To A New Version of Coff
  56.  
  57.     The recommended method is to select from the existing
  58.     implimentations the version of coff which is most like the one
  59.     you want to use, for our purposes, we'll say that i386 coff is
  60.     the one you select, and that your coff flavour is called foo.
  61.     Copy the @code{i386coff.c} to @code{foocoff.c}, copy
  62.     @code{../include/i386coff.h} to @code{../include/foocoff.h}
  63.     and add the lines to @code{targets.c} and @code{Makefile.in}
  64.     so that your new back end is used. Alter the shapes of the
  65.     structures in @code{../include/foocoff.h} so that they match
  66.     what you need. You will probably also have to add
  67.     @code{#ifdef}s to the code in @code{internalcoff.h} and
  68.     @code{coffcode.h} if your version of coff is too wild. 
  69.  
  70.     You can verify that your new BFD backend works quite simply by
  71.     building @code{objdump} from the @code{binutils} directory,
  72.     and making sure that its version of what's going on at your
  73.     host systems idea (assuming it has the pretty standard coff
  74.     dump utility (usually called @code{att-dump} or just
  75.     @code{dump})) are the same.  Then clean up your code, and send
  76.     what you've done to Cygnus. Then your stuff will be in the
  77.     next release, and you won't have to keep integrating it.
  78.  
  79. SUBSECTION
  80.     How The Coff Backend Works
  81.  
  82. SUBSUBSECTION
  83.     Bit Twiddling
  84.  
  85.     Each flavour of coff supported in BFD has its own header file
  86.     descibing the external layout of the structures. There is also
  87.     an internal description of the coff layout (in
  88.     @code{internalcoff.h}) file (@code{}). A major function of the
  89.     coff backend is swapping the bytes and twiddling the bits to
  90.     translate the external form of the structures into the normal
  91.     internal form. This is all performed in the
  92.     @code{bfd_swap}_@i{thing}_@i{direction} routines. Some
  93.     elements are different sizes between different versions of
  94.     coff, it is the duty of the coff version specific include file
  95.     to override the definitions of various packing routines in
  96.     @code{coffcode.h}. Eg the size of line number entry in coff is
  97.     sometimes 16 bits, and sometimes 32 bits. @code{#define}ing
  98.     @code{PUT_LNSZ_LNNO} and @code{GET_LNSZ_LNNO} will select the
  99.     correct one. No doubt, some day someone will find a version of
  100.     coff which has a varying field size not catered for at the
  101.     moment. To port BFD, that person will have to add more @code{#defines}.  
  102.     Three of the bit twiddling routines are exported to
  103.     @code{gdb}; @code{coff_swap_aux_in}, @code{coff_swap_sym_in}
  104.     and @code{coff_swap_linno_in}. @code{GDB} reads the symbol
  105.     table on its own, but uses BFD to fix things up.  More of the
  106.     bit twiddlers are exported for @code{gas};
  107.     @code{coff_swap_aux_out}, @code{coff_swap_sym_out},
  108.     @code{coff_swap_lineno_out}, @code{coff_swap_reloc_out},
  109.     @code{coff_swap_filehdr_out}, @code{coff_swap_aouthdr_out},
  110.     @code{coff_swap_scnhdr_out}. @code{Gas} currently keeps track
  111.     of all the symbol table and reloc drudgery itself, thereby
  112.     saving the internal BFD overhead, but uses BFD to swap things
  113.     on the way out, making cross ports much safer.  This also
  114.     allows BFD (and thus the linker) to use the same header files
  115.     as @code{gas}, which makes one avenue to disaster disappear.
  116.  
  117. SUBSUBSECTION
  118.     Symbol Reading
  119.  
  120.     The simple canonical form for symbols used by BFD is not rich
  121.     enough to keep all the information available in a coff symbol
  122.     table. The back end gets around this by keeping the original
  123.     symbol table around, "behind the scenes". 
  124.  
  125.     When a symbol table is requested (through a call to
  126.     @code{bfd_canonicalize_symtab}, a request gets through to
  127.     @code{get_normalized_symtab}. This reads the symbol table from
  128.     the coff file and swaps all the structures inside into the
  129.     internal form. It also fixes up all the pointers in the table
  130.     (represented in the file by offsets from the first symbol in
  131.     the table) into physical pointers to elements in the new
  132.     internal table. This involves some work since the meanings of
  133.     fields changes depending upon context; a field that is a
  134.     pointer to another structure in the symbol table at one moment
  135.     may be the size in bytes of a structure in the next.  Another
  136.     pass is made over the table. All symbols which mark file names
  137.     (<<C_FILE>> symbols) are modified so that the internal
  138.     string points to the value in the auxent (the real filename)
  139.     rather than the normal text associated with the symbol
  140.     (@code{".file"}). 
  141.  
  142.     At this time the symbol names are moved around. Coff stores
  143.     all symbols less than nine characters long physically
  144.     within the symbol table, longer strings are kept at the end of
  145.     the file in the string     table. This pass moves all strings
  146.     into memory, and replaces them with pointers to the strings.
  147.  
  148.  
  149.     The symbol table is massaged once again, this time to create
  150.     the canonical table used by the BFD application. Each symbol
  151.     is inspected in turn, and a decision made (using the
  152.     @code{sclass} field) about the various flags to set in the
  153.     @code{asymbol} @xref{Symbols}. The generated canonical table
  154.     shares strings with the hidden internal symbol table. 
  155.  
  156.     Any linenumbers are read from the coff file too, and attached
  157.     to the symbols which own the functions the linenumbers belong to. 
  158.  
  159. SUBSUBSECTION
  160.     Symbol Writing
  161.  
  162.     Writing a symbol to a coff file which didn't come from a coff
  163.     file will lose any debugging information. The @code{asymbol}
  164.     structure remembers the BFD from which was born, and on output
  165.     the back end makes sure that the same destination target as
  166.     source target is present.
  167.  
  168.     When the symbols have come from a coff file then all the
  169.     debugging information is preserved.
  170.  
  171.     Symbol tables are provided for writing to the back end in a
  172.     vector of pointers to pointers. This allows applications like
  173.     the linker to accumulate and output large symbol tables
  174.     without having to do too much byte copying.
  175.  
  176.     This function runs through the provided symbol table and
  177.     patches each symbol marked as a file place holder
  178.     (@code{C_FILE}) to point to the next file place holder in the
  179.     list. It also marks each @code{offset} field in the list with
  180.     the offset from the first symbol of the current symbol.
  181.  
  182.     Another function of this procedure is to turn the canonical
  183.     value form of BFD into the form used by coff. Internally, BFD
  184.     expects symbol values to be offsets from a section base; so a
  185.     symbol physically at 0x120, but in a section starting at
  186.     0x100, would have the value 0x20. Coff expects symbols to
  187.     contain their final value, so symbols have their values
  188.     changed at this point to reflect their sum with their owning
  189.     section. Note that this transformation uses the
  190.     <<output_section>> field of the @code{asymbol}'s
  191.     @code{asection} @xref{Sections}. 
  192.  
  193.     o coff_mangle_symbols
  194.  
  195.     This routine runs though the provided symbol table and uses
  196.     the offsets generated by the previous pass and the pointers
  197.     generated when the symbol table was read in to create the
  198.     structured hierachy required by coff. It changes each pointer
  199.     to a symbol to an index into the symbol table of the symbol
  200.     being referenced. 
  201.  
  202.     o coff_write_symbols
  203.  
  204.     This routine runs through the symbol table and patches up the
  205.     symbols from their internal form into the coff way, calls the
  206.     bit twiddlers and writes out the tabel to the file. 
  207.  
  208. */
  209.  
  210. /*
  211. INTERNAL_DEFINITION
  212.     coff_symbol_type
  213.  
  214. DESCRIPTION
  215.     The hidden information for an asymbol is described in a
  216.     coff_ptr_struct, which is typedefed to a combined_entry_type
  217.  
  218. CODE_FRAGMENT
  219. .
  220. .typedef struct coff_ptr_struct 
  221. .{
  222. .
  223. .       {* Remembers the offset from the first symbol in the file for
  224. .          this symbol. Generated by coff_renumber_symbols. *}
  225. .unsigned int offset;
  226. .
  227. .       {* Should the tag field of this symbol be renumbered.
  228. .          Created by coff_pointerize_aux. *}
  229. .char fix_tag;
  230. .
  231. .       {* Should the endidx field of this symbol be renumbered.
  232. .          Created by coff_pointerize_aux. *}
  233. .char fix_end;
  234. .
  235. .       {* The container for the symbol structure as read and translated
  236. .           from the file. *}
  237. .
  238. .union {
  239. .   union internal_auxent auxent;
  240. .   struct internal_syment syment;
  241. . } u;
  242. .} combined_entry_type;
  243. .
  244. .
  245. .{* Each canonical asymbol really looks like this: *}
  246. .
  247. .typedef struct coff_symbol_struct
  248. .{
  249. .   {* The actual symbol which the rest of BFD works with *}
  250. .asymbol symbol;
  251. .
  252. .   {* A pointer to the hidden information for this symbol *}
  253. .combined_entry_type *native;
  254. .
  255. .   {* A pointer to the linenumber information for this symbol *}
  256. .struct lineno_cache_entry *lineno;
  257. .
  258. .   {* Have the line numbers been relocated yet ? *}
  259. .boolean done_lineno;
  260. .} coff_symbol_type;
  261.  
  262.  
  263. */
  264.  
  265. #include "seclet.h"
  266. extern bfd_error_vector_type bfd_error_vector;
  267.  
  268.  
  269.  
  270.  
  271. #define PUTWORD bfd_h_put_32
  272. #define PUTHALF bfd_h_put_16
  273. #define    PUTBYTE bfd_h_put_8
  274.  
  275. #ifndef GET_FCN_LNNOPTR
  276. #define GET_FCN_LNNOPTR(abfd, ext)  bfd_h_get_32(abfd, (bfd_byte *) ext->x_sym.x_fcnary.x_fcn.x_lnnoptr)
  277. #endif
  278.  
  279. #ifndef GET_FCN_ENDNDX
  280. #define GET_FCN_ENDNDX(abfd, ext)  bfd_h_get_32(abfd, (bfd_byte *) ext->x_sym.x_fcnary.x_fcn.x_endndx)
  281. #endif
  282.  
  283. #ifndef PUT_FCN_LNNOPTR
  284. #define PUT_FCN_LNNOPTR(abfd, in, ext)  PUTWORD(abfd,  in, (bfd_byte *) ext->x_sym.x_fcnary.x_fcn.x_lnnoptr)
  285. #endif
  286. #ifndef PUT_FCN_ENDNDX
  287. #define PUT_FCN_ENDNDX(abfd, in, ext) PUTWORD(abfd, in, (bfd_byte *) ext->x_sym.x_fcnary.x_fcn.x_endndx)
  288. #endif
  289. #ifndef GET_LNSZ_LNNO
  290. #define GET_LNSZ_LNNO(abfd, ext) bfd_h_get_16(abfd, (bfd_byte *) ext->x_sym.x_misc.x_lnsz.x_lnno)
  291. #endif
  292. #ifndef GET_LNSZ_SIZE
  293. #define GET_LNSZ_SIZE(abfd, ext) bfd_h_get_16(abfd, (bfd_byte *) ext->x_sym.x_misc.x_lnsz.x_size)
  294. #endif
  295. #ifndef PUT_LNSZ_LNNO
  296. #define PUT_LNSZ_LNNO(abfd, in, ext) bfd_h_put_16(abfd, in, (bfd_byte *)ext->x_sym.x_misc.x_lnsz.x_lnno)
  297. #endif
  298. #ifndef PUT_LNSZ_SIZE
  299. #define PUT_LNSZ_SIZE(abfd, in, ext) bfd_h_put_16(abfd, in, (bfd_byte*) ext->x_sym.x_misc.x_lnsz.x_size)
  300. #endif
  301. #ifndef GET_SCN_SCNLEN
  302. #define GET_SCN_SCNLEN(abfd,  ext) bfd_h_get_32(abfd, (bfd_byte *) ext->x_scn.x_scnlen)
  303. #endif
  304. #ifndef GET_SCN_NRELOC
  305. #define GET_SCN_NRELOC(abfd,  ext) bfd_h_get_16(abfd, (bfd_byte *)ext->x_scn.x_nreloc)
  306. #endif
  307. #ifndef GET_SCN_NLINNO
  308. #define GET_SCN_NLINNO(abfd, ext)  bfd_h_get_16(abfd, (bfd_byte *)ext->x_scn.x_nlinno)
  309. #endif
  310. #ifndef PUT_SCN_SCNLEN
  311. #define PUT_SCN_SCNLEN(abfd,in, ext) bfd_h_put_32(abfd, in, (bfd_byte *) ext->x_scn.x_scnlen)
  312. #endif
  313. #ifndef PUT_SCN_NRELOC
  314. #define PUT_SCN_NRELOC(abfd,in, ext) bfd_h_put_16(abfd, in, (bfd_byte *)ext->x_scn.x_nreloc)
  315. #endif
  316. #ifndef PUT_SCN_NLINNO
  317. #define PUT_SCN_NLINNO(abfd,in, ext)  bfd_h_put_16(abfd,in, (bfd_byte  *) ext->x_scn.x_nlinno)
  318. #endif
  319. #ifndef GET_LINENO_LNNO
  320. #define GET_LINENO_LNNO(abfd, ext) bfd_h_get_16(abfd, (bfd_byte *) (ext->l_lnno));
  321. #endif
  322. #ifndef PUT_LINENO_LNNO
  323. #define PUT_LINENO_LNNO(abfd,val, ext) bfd_h_put_16(abfd,val,  (bfd_byte *) (ext->l_lnno));
  324. #endif
  325.  
  326.  
  327. /* void warning(); */
  328.  
  329. /*
  330.  * Return a word with STYP_* (scnhdr.s_flags) flags set to represent the
  331.  * incoming SEC_* flags.  The inverse of this function is styp_to_sec_flags().
  332.  * NOTE: If you add to/change this routine, you should mirror the changes
  333.  *     in styp_to_sec_flags().
  334.  */
  335. static long
  336. DEFUN(sec_to_styp_flags, (sec_name, sec_flags),
  337.     CONST char *        sec_name    AND
  338.     flagword    sec_flags)
  339. {
  340.     long styp_flags = 0;
  341.  
  342.     if (!strcmp(sec_name, _TEXT)) {
  343.     return((long)STYP_TEXT);
  344.     } else if (!strcmp(sec_name, _DATA)) {
  345.     return((long)STYP_DATA);
  346.     } else if (!strcmp(sec_name, _BSS)) {
  347.     return((long)STYP_BSS);
  348. #ifdef _COMMENT
  349.     } else if (!strcmp(sec_name, _COMMENT)) {
  350.         return((long)STYP_INFO);
  351. #endif /* _COMMENT */
  352.     }
  353.  
  354. /* Try and figure out what it should be */
  355.    if (sec_flags & SEC_CODE) styp_flags = STYP_TEXT;
  356.    if (sec_flags & SEC_DATA) styp_flags = STYP_DATA;
  357.    else if (sec_flags & SEC_READONLY)
  358. #ifdef STYP_LIT    /* 29k readonly text/data section */
  359.        styp_flags = STYP_LIT;
  360. #else
  361.        styp_flags = STYP_TEXT;
  362. #endif    /* STYP_LIT */
  363.    else if (sec_flags & SEC_LOAD) styp_flags = STYP_TEXT;
  364.  
  365.    if (styp_flags == 0) styp_flags = STYP_BSS;
  366.  
  367.    return(styp_flags);
  368. }
  369. /*
  370.  * Return a word with SEC_* flags set to represent the incoming
  371.  * STYP_* flags (from scnhdr.s_flags).   The inverse of this
  372.  * function is sec_to_styp_flags().
  373.  * NOTE: If you add to/change this routine, you should mirror the changes
  374.  *      in sec_to_styp_flags().
  375.  */
  376. static flagword
  377. DEFUN(styp_to_sec_flags, (styp_flags),
  378.     long    styp_flags)
  379. {
  380.     flagword    sec_flags=0;
  381.  
  382.     if ((styp_flags & STYP_TEXT) || (styp_flags & STYP_DATA))
  383.     sec_flags = (SEC_LOAD | SEC_ALLOC);
  384.     else if (styp_flags & STYP_BSS)
  385.     sec_flags = SEC_ALLOC;
  386.  
  387. #ifdef STYP_LIT        /* A29k readonly text/data section type */
  388.     if ((styp_flags & STYP_LIT) == STYP_LIT)
  389.     sec_flags = (SEC_LOAD | SEC_ALLOC | SEC_READONLY);
  390. #endif  /* STYP_LIT */
  391. #ifdef STYP_OTHER_LOAD    /* Other loaded sections */
  392.     if (styp_flags & STYP_OTHER_LOAD)
  393.     sec_flags = (SEC_LOAD | SEC_ALLOC);
  394. #endif  /* STYP_SDATA */
  395.  
  396.     return(sec_flags);
  397. }
  398.  
  399. #define    get_index(symbol)    ((int) (symbol)->value)
  400. #define    set_index(symbol, idx)    ((symbol)->value = (idx))
  401.  
  402. /*  **********************************************************************
  403. Here are all the routines for swapping the structures seen in the
  404. outside world into the internal forms.
  405. */
  406.  
  407.  
  408. static void
  409. DEFUN(bfd_swap_reloc_in,(abfd, reloc_src, reloc_dst),
  410.       bfd            *abfd AND
  411.       RELOC *reloc_src AND
  412.       struct internal_reloc *reloc_dst)
  413. {
  414.   reloc_dst->r_vaddr = bfd_h_get_32(abfd, (bfd_byte *)reloc_src->r_vaddr);
  415.   reloc_dst->r_symndx = bfd_h_get_32(abfd, (bfd_byte *) reloc_src->r_symndx);
  416.  
  417. #ifdef RS6000COFF_C
  418.   reloc_dst->r_type = bfd_h_get_8(abfd, reloc_src->r_type);
  419.   reloc_dst->r_size = bfd_h_get_8(abfd, reloc_src->r_size);
  420. #else
  421.   reloc_dst->r_type = bfd_h_get_16(abfd, (bfd_byte *) reloc_src->r_type);
  422. #endif
  423.  
  424. #ifdef SWAP_IN_RELOC_OFFSET
  425.   reloc_dst->r_offset = SWAP_IN_RELOC_OFFSET(abfd,
  426.                          (bfd_byte *) reloc_src->r_offset);
  427. #endif
  428. }
  429.  
  430.  
  431. static unsigned int
  432. DEFUN(coff_swap_reloc_out,(abfd, src, dst),
  433.       bfd       *abfd AND
  434.       PTR    src AND
  435.       PTR    dst)
  436. {
  437.   struct internal_reloc *reloc_src = (struct internal_reloc *)src;
  438.   struct external_reloc *reloc_dst = (struct external_reloc *)dst;
  439.   bfd_h_put_32(abfd, reloc_src->r_vaddr, (bfd_byte *) reloc_dst->r_vaddr);
  440.   bfd_h_put_32(abfd, reloc_src->r_symndx, (bfd_byte *) reloc_dst->r_symndx);
  441.   bfd_h_put_16(abfd, reloc_src->r_type, (bfd_byte *)
  442.            reloc_dst->r_type);
  443.  
  444. #ifdef SWAP_OUT_RELOC_OFFSET
  445.   SWAP_OUT_RELOC_OFFSET(abfd,
  446.             reloc_src->r_offset,
  447.             (bfd_byte *) reloc_dst->r_offset);
  448. #endif
  449. #ifdef SWAP_OUT_RELOC_EXTRA
  450.   SWAP_OUT_RELOC_EXTRA(abfd,reloc_src, reloc_dst);
  451. #endif
  452.  
  453.   return sizeof(struct external_reloc);
  454. }
  455.  
  456. static void
  457. DEFUN(bfd_swap_filehdr_in,(abfd, filehdr_src, filehdr_dst),
  458.       bfd            *abfd AND
  459.       FILHDR         *filehdr_src AND
  460.       struct internal_filehdr *filehdr_dst)
  461. {
  462.   filehdr_dst->f_magic = bfd_h_get_16(abfd, (bfd_byte *) filehdr_src->f_magic);
  463.   filehdr_dst->f_nscns = bfd_h_get_16(abfd, (bfd_byte *)filehdr_src-> f_nscns);
  464.   filehdr_dst->f_timdat = bfd_h_get_32(abfd, (bfd_byte *)filehdr_src-> f_timdat);
  465.   filehdr_dst->f_symptr = bfd_h_get_32(abfd, (bfd_byte *)filehdr_src-> f_symptr);
  466.   filehdr_dst->f_nsyms = bfd_h_get_32(abfd, (bfd_byte *)filehdr_src-> f_nsyms);
  467.   filehdr_dst->f_opthdr = bfd_h_get_16(abfd, (bfd_byte *)filehdr_src-> f_opthdr);
  468.   filehdr_dst->f_flags = bfd_h_get_16(abfd, (bfd_byte *)filehdr_src-> f_flags);
  469. }
  470.  
  471. static  unsigned int
  472. DEFUN(coff_swap_filehdr_out,(abfd, in, out),
  473.       bfd       *abfd AND
  474.       PTR    in AND
  475.       PTR    out)
  476. {
  477.   struct internal_filehdr *filehdr_in = (struct internal_filehdr *)in;
  478.   FILHDR *filehdr_out = (FILHDR *)out;
  479.   bfd_h_put_16(abfd, filehdr_in->f_magic, (bfd_byte *) filehdr_out->f_magic);
  480.   bfd_h_put_16(abfd, filehdr_in->f_nscns, (bfd_byte *) filehdr_out->f_nscns);
  481.   bfd_h_put_32(abfd, filehdr_in->f_timdat, (bfd_byte *) filehdr_out->f_timdat);
  482.   bfd_h_put_32(abfd, filehdr_in->f_symptr, (bfd_byte *) filehdr_out->f_symptr);
  483.   bfd_h_put_32(abfd, filehdr_in->f_nsyms, (bfd_byte *) filehdr_out->f_nsyms);
  484.   bfd_h_put_16(abfd, filehdr_in->f_opthdr, (bfd_byte *) filehdr_out->f_opthdr);
  485.   bfd_h_put_16(abfd, filehdr_in->f_flags, (bfd_byte *) filehdr_out->f_flags);
  486.   return sizeof(FILHDR);
  487. }
  488.  
  489.  
  490. #ifndef NO_COFF_SYMBOLS
  491.  
  492. static void
  493. DEFUN(coff_swap_sym_in,(abfd, ext1, in1),
  494.       bfd            *abfd AND
  495.       PTR ext1 AND
  496.       PTR in1)
  497. {
  498.   SYMENT *ext = (SYMENT *)ext1;
  499.   struct internal_syment      *in = (struct internal_syment *)in1;
  500.  
  501.   if( ext->e.e_name[0] == 0) {
  502.     in->_n._n_n._n_zeroes = 0;
  503.     in->_n._n_n._n_offset = bfd_h_get_32(abfd, (bfd_byte *) ext->e.e.e_offset);
  504.   }
  505.   else {
  506. #if SYMNMLEN != E_SYMNMLEN
  507.    -> Error, we need to cope with truncating or extending SYMNMLEN!;
  508. #else
  509.     memcpy(in->_n._n_name, ext->e.e_name, SYMNMLEN);
  510. #endif
  511.   }
  512.   in->n_value = bfd_h_get_32(abfd, (bfd_byte *) ext->e_value);
  513.   in->n_scnum = bfd_h_get_16(abfd, (bfd_byte *) ext->e_scnum);
  514.   if (sizeof(ext->e_type) == 2){
  515.     in->n_type = bfd_h_get_16(abfd, (bfd_byte *) ext->e_type);
  516.   }
  517.   else {
  518.     in->n_type = bfd_h_get_32(abfd, (bfd_byte *) ext->e_type);
  519.   }
  520.   in->n_sclass = bfd_h_get_8(abfd, ext->e_sclass);
  521.   in->n_numaux = bfd_h_get_8(abfd, ext->e_numaux);
  522. }
  523.  
  524. static unsigned int
  525. DEFUN(coff_swap_sym_out,(abfd, inp, extp),
  526.       bfd       *abfd AND
  527.       PTR    inp AND
  528.       PTR    extp)
  529. {
  530.   struct internal_syment *in = (struct internal_syment *)inp;
  531.   SYMENT *ext =(SYMENT *)extp;
  532.   if(in->_n._n_name[0] == 0) {
  533.     bfd_h_put_32(abfd, 0, (bfd_byte *) ext->e.e.e_zeroes);
  534.     bfd_h_put_32(abfd, in->_n._n_n._n_offset, (bfd_byte *)  ext->e.e.e_offset);
  535.   }
  536.   else {
  537. #if SYMNMLEN != E_SYMNMLEN
  538.     -> Error, we need to cope with truncating or extending SYMNMLEN!;
  539. #else
  540.     memcpy(ext->e.e_name, in->_n._n_name, SYMNMLEN);
  541. #endif
  542.   }
  543.   bfd_h_put_32(abfd,  in->n_value , (bfd_byte *) ext->e_value);
  544.   bfd_h_put_16(abfd,  in->n_scnum , (bfd_byte *) ext->e_scnum);
  545.   if (sizeof(ext->e_type) == 2)
  546.       {
  547.     bfd_h_put_16(abfd,  in->n_type , (bfd_byte *) ext->e_type);
  548.       }
  549.   else
  550.       {
  551.     bfd_h_put_32(abfd,  in->n_type , (bfd_byte *) ext->e_type);
  552.       }
  553.   bfd_h_put_8(abfd,  in->n_sclass , ext->e_sclass);
  554.   bfd_h_put_8(abfd,  in->n_numaux , ext->e_numaux);
  555.   return sizeof(SYMENT);
  556. }
  557.  
  558. static void
  559. DEFUN(coff_swap_aux_in,(abfd, ext1, type, class, in1),
  560.       bfd            *abfd AND
  561.       PTR           ext1 AND
  562.       int             type AND
  563.       int             class AND
  564.       PTR           in1)
  565. {
  566.   AUXENT    *ext = (AUXENT *)ext1;
  567.   union internal_auxent *in = (union internal_auxent *)in1;
  568.  
  569.   switch (class) {
  570.     case C_FILE:
  571.       if (ext->x_file.x_fname[0] == 0) {
  572.       in->x_file.x_n.x_zeroes = 0;
  573.       in->x_file.x_n.x_offset = 
  574.        bfd_h_get_32(abfd, (bfd_byte *) ext->x_file.x_n.x_offset);
  575.     } else {
  576. #if FILNMLEN != E_FILNMLEN
  577.         -> Error, we need to cope with truncating or extending FILNMLEN!;
  578. #else
  579.         memcpy (in->x_file.x_fname, ext->x_file.x_fname, FILNMLEN);
  580. #endif
  581.       }
  582.       break;
  583.  
  584.       /* RS/6000 "csect" auxents */
  585. #ifdef RS6000COFF_C
  586.     case C_EXT:
  587.     case C_HIDEXT:
  588.       in->x_csect.x_scnlen   = bfd_h_get_32 (abfd, (bfd_byte *) ext->x_csect.x_scnlen);
  589.       in->x_csect.x_parmhash = bfd_h_get_32 (abfd, (bfd_byte *) ext->x_csect.x_parmhash);
  590.       in->x_csect.x_snhash   = bfd_h_get_16 (abfd, (bfd_byte *) ext->x_csect.x_snhash);
  591.       /* We don't have to hack bitfields in x_smtyp because it's defined by
  592.      shifts-and-ands, which are equivalent on all byte orders.  */
  593.       in->x_csect.x_smtyp    = bfd_h_get_8  (abfd, (bfd_byte *) ext->x_csect.x_smtyp);
  594.       in->x_csect.x_smclas   = bfd_h_get_8  (abfd, (bfd_byte *) ext->x_csect.x_smclas);
  595.       in->x_csect.x_stab     = bfd_h_get_32 (abfd, (bfd_byte *) ext->x_csect.x_stab);
  596.       in->x_csect.x_snstab   = bfd_h_get_16 (abfd, (bfd_byte *) ext->x_csect.x_snstab);
  597.       break;
  598. #endif
  599.  
  600.     case C_STAT:
  601. #ifdef C_LEAFSTAT
  602.     case C_LEAFSTAT:
  603. #endif
  604.     case C_HIDDEN:
  605.       if (type == T_NULL) {
  606.       in->x_scn.x_scnlen = GET_SCN_SCNLEN(abfd, ext);
  607.       in->x_scn.x_nreloc = GET_SCN_NRELOC(abfd, ext);
  608.       in->x_scn.x_nlinno = GET_SCN_NLINNO(abfd, ext);
  609.       break;
  610.     }
  611.     default:
  612.       in->x_sym.x_tagndx.l = bfd_h_get_32(abfd, (bfd_byte *) ext->x_sym.x_tagndx);
  613. #ifndef NO_TVNDX
  614.       in->x_sym.x_tvndx = bfd_h_get_16(abfd, (bfd_byte *) ext->x_sym.x_tvndx);
  615. #endif
  616.  
  617.       if (ISARY(type) || class == C_BLOCK) {
  618. #if DIMNUM != E_DIMNUM
  619.       -> Error, we need to cope with truncating or extending DIMNUM!;
  620. #else
  621.       in->x_sym.x_fcnary.x_ary.x_dimen[0] = bfd_h_get_16(abfd, (bfd_byte *) ext->x_sym.x_fcnary.x_ary.x_dimen[0]);
  622.       in->x_sym.x_fcnary.x_ary.x_dimen[1] = bfd_h_get_16(abfd, (bfd_byte *) ext->x_sym.x_fcnary.x_ary.x_dimen[1]);
  623.       in->x_sym.x_fcnary.x_ary.x_dimen[2] = bfd_h_get_16(abfd, (bfd_byte *) ext->x_sym.x_fcnary.x_ary.x_dimen[2]);
  624.       in->x_sym.x_fcnary.x_ary.x_dimen[3] = bfd_h_get_16(abfd, (bfd_byte *) ext->x_sym.x_fcnary.x_ary.x_dimen[3]);
  625. #endif
  626.     }
  627.       in->x_sym.x_fcnary.x_fcn.x_lnnoptr = GET_FCN_LNNOPTR(abfd, ext);
  628.       in->x_sym.x_fcnary.x_fcn.x_endndx.l = GET_FCN_ENDNDX(abfd, ext);
  629.  
  630.       if (ISFCN(type)) {
  631.       in->x_sym.x_misc.x_fsize = bfd_h_get_32(abfd, (bfd_byte *) ext->x_sym.x_misc.x_fsize);
  632.     }
  633.       else {
  634.       in->x_sym.x_misc.x_lnsz.x_lnno = GET_LNSZ_LNNO(abfd, ext);
  635.       in->x_sym.x_misc.x_lnsz.x_size = GET_LNSZ_SIZE(abfd, ext);
  636.     }
  637.     }
  638. }
  639.  
  640. static unsigned int
  641. DEFUN(coff_swap_aux_out,(abfd, inp, type, class, extp),
  642.   bfd   *abfd AND
  643.   PTR     inp AND
  644.   int   type AND
  645.   int   class AND
  646.   PTR    extp)
  647. {
  648.   union internal_auxent *in = (union internal_auxent *)inp;
  649.   AUXENT *ext = (AUXENT *)extp;
  650.   switch (class) {
  651.   case C_FILE:
  652.     if (in->x_file.x_fname[0] == 0) {
  653.       PUTWORD(abfd, 0, (bfd_byte *) ext->x_file.x_n.x_zeroes);
  654.       PUTWORD(abfd,
  655.           in->x_file.x_n.x_offset,
  656.           (bfd_byte *) ext->x_file.x_n.x_offset);
  657.     }
  658.     else {
  659. #if FILNMLEN != E_FILNMLEN
  660.       -> Error, we need to cope with truncating or extending FILNMLEN!;
  661. #else
  662.       memcpy (ext->x_file.x_fname, in->x_file.x_fname, FILNMLEN);
  663. #endif
  664.     }
  665.     break;
  666.  
  667. #ifdef RS6000COFF_C
  668.   /* RS/6000 "csect" auxents */
  669.   case C_EXT:
  670.   case C_HIDEXT:
  671.     PUTWORD (abfd, in->x_csect.x_scnlen,    ext->x_csect.x_scnlen);
  672.     PUTWORD (abfd, in->x_csect.x_parmhash,    ext->x_csect.x_parmhash);
  673.     PUTHALF (abfd, in->x_csect.x_snhash,    ext->x_csect.x_snhash);
  674.     /* We don't have to hack bitfields in x_smtyp because it's defined by
  675.        shifts-and-ands, which are equivalent on all byte orders.  */
  676.     PUTBYTE (abfd, in->x_csect.x_smtyp,        ext->x_csect.x_smtyp);
  677.     PUTBYTE (abfd, in->x_csect.x_smclas,    ext->x_csect.x_smclas);
  678.     PUTWORD (abfd, in->x_csect.x_stab,        ext->x_csect.x_stab);
  679.     PUTHALF (abfd, in->x_csect.x_snstab,    ext->x_csect.x_snstab);
  680.     break;
  681. #endif
  682.  
  683.   case C_STAT:
  684. #ifdef C_LEAFSTAT
  685.   case C_LEAFSTAT:
  686. #endif
  687.   case C_HIDDEN:
  688.     if (type == T_NULL) {
  689.       PUT_SCN_SCNLEN(abfd, in->x_scn.x_scnlen, ext);
  690.       PUT_SCN_NRELOC(abfd, in->x_scn.x_nreloc, ext);
  691.       PUT_SCN_NLINNO(abfd, in->x_scn.x_nlinno, ext);
  692.       break;
  693.     }
  694.   default:
  695.     PUTWORD(abfd, in->x_sym.x_tagndx.l, (bfd_byte *) ext->x_sym.x_tagndx);
  696. #ifndef NO_TVNDX
  697.     bfd_h_put_16(abfd, in->x_sym.x_tvndx , (bfd_byte *) ext->x_sym.x_tvndx);
  698. #endif
  699.  
  700.     if (ISFCN(type)) {
  701.       PUTWORD(abfd, in->x_sym.x_misc.x_fsize, (bfd_byte *)  ext->x_sym.x_misc.x_fsize);
  702.       PUT_FCN_LNNOPTR(abfd,  in->x_sym.x_fcnary.x_fcn.x_lnnoptr, ext);
  703.       PUT_FCN_ENDNDX(abfd,  in->x_sym.x_fcnary.x_fcn.x_endndx.l, ext);
  704.     }
  705.     else {
  706.  
  707.       if (ISARY(type) || class == C_BLOCK) {
  708. #if DIMNUM != E_DIMNUM
  709.     -> Error, we need to cope with truncating or extending DIMNUM!;
  710. #else
  711.     bfd_h_put_16(abfd, in->x_sym.x_fcnary.x_ary.x_dimen[0], (bfd_byte *)ext->x_sym.x_fcnary.x_ary.x_dimen[0]);
  712.     bfd_h_put_16(abfd, in->x_sym.x_fcnary.x_ary.x_dimen[1], (bfd_byte *)ext->x_sym.x_fcnary.x_ary.x_dimen[1]);
  713.     bfd_h_put_16(abfd, in->x_sym.x_fcnary.x_ary.x_dimen[2], (bfd_byte *)ext->x_sym.x_fcnary.x_ary.x_dimen[2]);
  714.     bfd_h_put_16(abfd, in->x_sym.x_fcnary.x_ary.x_dimen[3], (bfd_byte *)ext->x_sym.x_fcnary.x_ary.x_dimen[3]);
  715. #endif
  716.       }
  717.       PUT_LNSZ_LNNO(abfd, in->x_sym.x_misc.x_lnsz.x_lnno, ext);
  718.       PUT_LNSZ_SIZE(abfd, in->x_sym.x_misc.x_lnsz.x_size, ext);
  719.  
  720.       PUT_FCN_LNNOPTR(abfd,  in->x_sym.x_fcnary.x_fcn.x_lnnoptr, ext);
  721.       PUT_FCN_ENDNDX(abfd,  in->x_sym.x_fcnary.x_fcn.x_endndx.l, ext);
  722.  
  723.  
  724.     }
  725.   }
  726. return sizeof(AUXENT);
  727. }
  728.  
  729. #endif /* NO_COFF_SYMBOLS */
  730.  
  731. #ifndef NO_COFF_LINENOS
  732.  
  733. static void
  734. DEFUN(coff_swap_lineno_in,(abfd, ext1, in1),
  735.       bfd            *abfd AND
  736.       PTR ext1 AND
  737.       PTR in1)
  738. {
  739.   LINENO *ext = (LINENO *)ext1;
  740.   struct internal_lineno      *in = (struct internal_lineno *)in1;
  741.  
  742.   in->l_addr.l_symndx = bfd_h_get_32(abfd, (bfd_byte *) ext->l_addr.l_symndx);
  743.   in->l_lnno = GET_LINENO_LNNO(abfd, ext);
  744. }
  745.  
  746. static unsigned int
  747. DEFUN(coff_swap_lineno_out,(abfd, inp, outp),
  748.       bfd       *abfd AND
  749.       PTR    inp AND
  750.       PTR    outp)
  751. {
  752.   struct internal_lineno *in = (struct internal_lineno *)inp;
  753.   struct external_lineno *ext = (struct external_lineno *)outp;
  754.   PUTWORD(abfd, in->l_addr.l_symndx, (bfd_byte *)
  755.       ext->l_addr.l_symndx);
  756.  
  757.   PUT_LINENO_LNNO (abfd, in->l_lnno, ext);
  758.   return sizeof(struct external_lineno);
  759. }
  760.  
  761. #endif /* NO_COFF_LINENOS */
  762.  
  763.  
  764. static void
  765. DEFUN(bfd_swap_aouthdr_in,(abfd, aouthdr_ext1, aouthdr_int1),
  766.       bfd            *abfd AND
  767.       PTR aouthdr_ext1 AND
  768.       PTR aouthdr_int1)
  769. {
  770.   AOUTHDR        *aouthdr_ext = (AOUTHDR *) aouthdr_ext1;
  771.   struct internal_aouthdr *aouthdr_int = (struct internal_aouthdr *)aouthdr_int1;
  772.  
  773.   aouthdr_int->magic = bfd_h_get_16(abfd, (bfd_byte *) aouthdr_ext->magic);
  774.   aouthdr_int->vstamp = bfd_h_get_16(abfd, (bfd_byte *) aouthdr_ext->vstamp);
  775.   aouthdr_int->tsize = bfd_h_get_32(abfd, (bfd_byte *) aouthdr_ext->tsize);
  776.   aouthdr_int->dsize = bfd_h_get_32(abfd, (bfd_byte *) aouthdr_ext->dsize);
  777.   aouthdr_int->bsize = bfd_h_get_32(abfd, (bfd_byte *) aouthdr_ext->bsize);
  778.   aouthdr_int->entry = bfd_h_get_32(abfd, (bfd_byte *) aouthdr_ext->entry);
  779.   aouthdr_int->text_start = bfd_h_get_32(abfd, (bfd_byte *) aouthdr_ext->text_start);
  780.   aouthdr_int->data_start = bfd_h_get_32(abfd, (bfd_byte *) aouthdr_ext->data_start);
  781. #ifdef I960
  782.   aouthdr_int->tagentries = bfd_h_get_32(abfd, (bfd_byte *) aouthdr_ext->tagentries);
  783. #endif
  784.  
  785. #ifdef RS6000COFF_C
  786.   aouthdr_int->o_toc = bfd_h_get_32(abfd, aouthdr_ext->o_toc);
  787.   aouthdr_int->o_snentry = bfd_h_get_16(abfd, aouthdr_ext->o_snentry);
  788.   aouthdr_int->o_sntext = bfd_h_get_16(abfd, aouthdr_ext->o_sntext);
  789.   aouthdr_int->o_sndata = bfd_h_get_16(abfd, aouthdr_ext->o_sndata);
  790.   aouthdr_int->o_sntoc = bfd_h_get_16(abfd, aouthdr_ext->o_sntoc);
  791.   aouthdr_int->o_snloader = bfd_h_get_16(abfd, aouthdr_ext->o_snloader);
  792.   aouthdr_int->o_snbss = bfd_h_get_16(abfd, aouthdr_ext->o_snbss);
  793.   aouthdr_int->o_algntext = bfd_h_get_16(abfd, aouthdr_ext->o_algntext);
  794.   aouthdr_int->o_algndata = bfd_h_get_16(abfd, aouthdr_ext->o_algndata);
  795.   aouthdr_int->o_modtype = bfd_h_get_16(abfd, aouthdr_ext->o_modtype);
  796.   aouthdr_int->o_maxstack = bfd_h_get_32(abfd, aouthdr_ext->o_maxstack);
  797. #endif
  798. }
  799.  
  800. static unsigned int
  801. DEFUN(coff_swap_aouthdr_out,(abfd, in, out),
  802.       bfd       *abfd AND
  803.       PTR    in AND
  804.       PTR    out)
  805. {
  806.   struct internal_aouthdr *aouthdr_in = (struct internal_aouthdr *)in;
  807.   AOUTHDR *aouthdr_out = (AOUTHDR *)out;
  808.   bfd_h_put_16(abfd, aouthdr_in->magic, (bfd_byte *) aouthdr_out->magic);
  809.   bfd_h_put_16(abfd, aouthdr_in->vstamp, (bfd_byte *) aouthdr_out->vstamp);
  810.   bfd_h_put_32(abfd, aouthdr_in->tsize, (bfd_byte *) aouthdr_out->tsize);
  811.   bfd_h_put_32(abfd, aouthdr_in->dsize, (bfd_byte *) aouthdr_out->dsize);
  812.   bfd_h_put_32(abfd, aouthdr_in->bsize, (bfd_byte *) aouthdr_out->bsize);
  813.   bfd_h_put_32(abfd, aouthdr_in->entry, (bfd_byte *) aouthdr_out->entry);
  814.   bfd_h_put_32(abfd, aouthdr_in->text_start,
  815.            (bfd_byte *) aouthdr_out->text_start);
  816.   bfd_h_put_32(abfd, aouthdr_in->data_start, (bfd_byte *) aouthdr_out->data_start);
  817. #ifdef I960
  818.   bfd_h_put_32(abfd, aouthdr_in->tagentries, (bfd_byte *) aouthdr_out->tagentries);
  819. #endif
  820.   return sizeof(AOUTHDR);
  821. }
  822.  
  823. static void
  824. DEFUN(coff_swap_scnhdr_in,(abfd, scnhdr_ext, scnhdr_int),
  825.       bfd            *abfd AND
  826.       SCNHDR         *scnhdr_ext AND
  827.       struct internal_scnhdr *scnhdr_int)
  828. {
  829.   memcpy(scnhdr_int->s_name, scnhdr_ext->s_name, sizeof(scnhdr_int->s_name));
  830.   scnhdr_int->s_vaddr = bfd_h_get_32(abfd, (bfd_byte *) scnhdr_ext->s_vaddr);
  831.   scnhdr_int->s_paddr = bfd_h_get_32(abfd, (bfd_byte *) scnhdr_ext->s_paddr);
  832.   scnhdr_int->s_size = bfd_h_get_32(abfd, (bfd_byte *)  scnhdr_ext->s_size);
  833.  
  834.   scnhdr_int->s_scnptr = bfd_h_get_32(abfd, (bfd_byte *) scnhdr_ext->s_scnptr);
  835.   scnhdr_int->s_relptr = bfd_h_get_32(abfd, (bfd_byte *) scnhdr_ext->s_relptr);
  836.   scnhdr_int->s_lnnoptr = bfd_h_get_32(abfd, (bfd_byte *) scnhdr_ext->s_lnnoptr);
  837.   scnhdr_int->s_flags = bfd_h_get_32(abfd, (bfd_byte *) scnhdr_ext->s_flags);
  838. #if defined(M88)
  839.   scnhdr_int->s_nreloc = bfd_h_get_32(abfd, (bfd_byte *) scnhdr_ext->s_nreloc);
  840.   scnhdr_int->s_nlnno = bfd_h_get_32(abfd, (bfd_byte *) scnhdr_ext->s_nlnno);
  841. #else
  842.   scnhdr_int->s_nreloc = bfd_h_get_16(abfd, (bfd_byte *) scnhdr_ext->s_nreloc);
  843.   scnhdr_int->s_nlnno = bfd_h_get_16(abfd, (bfd_byte *) scnhdr_ext->s_nlnno);
  844. #endif
  845. #ifdef I960
  846.   scnhdr_int->s_align = bfd_h_get_32(abfd, (bfd_byte *) scnhdr_ext->s_align);
  847. #endif
  848. }
  849.  
  850. static unsigned int
  851. DEFUN(coff_swap_scnhdr_out,(abfd, in, out),
  852.       bfd       *abfd AND
  853.       PTR    in AND
  854.       PTR    out)
  855. {
  856.   struct internal_scnhdr *scnhdr_int = (struct internal_scnhdr *)in;
  857.   SCNHDR *scnhdr_ext = (SCNHDR *)out;
  858.   memcpy(scnhdr_ext->s_name, scnhdr_int->s_name, sizeof(scnhdr_int->s_name));
  859.   PUTWORD(abfd, scnhdr_int->s_vaddr, (bfd_byte *) scnhdr_ext->s_vaddr);
  860.   PUTWORD(abfd, scnhdr_int->s_paddr, (bfd_byte *) scnhdr_ext->s_paddr);
  861.   PUTWORD(abfd, scnhdr_int->s_size, (bfd_byte *) scnhdr_ext->s_size);
  862.   PUTWORD(abfd, scnhdr_int->s_scnptr, (bfd_byte *) scnhdr_ext->s_scnptr);
  863.   PUTWORD(abfd, scnhdr_int->s_relptr, (bfd_byte *) scnhdr_ext->s_relptr);
  864.   PUTWORD(abfd, scnhdr_int->s_lnnoptr, (bfd_byte *) scnhdr_ext->s_lnnoptr);
  865.   PUTWORD(abfd, scnhdr_int->s_flags, (bfd_byte *) scnhdr_ext->s_flags);
  866. #if defined(M88)
  867.   PUTWORD(abfd, scnhdr_int->s_nlnno, (bfd_byte *) scnhdr_ext->s_nlnno);
  868.   PUTWORD(abfd, scnhdr_int->s_nreloc, (bfd_byte *) scnhdr_ext->s_nreloc);
  869. #else
  870.   PUTHALF(abfd, scnhdr_int->s_nlnno, (bfd_byte *) scnhdr_ext->s_nlnno);
  871.   PUTHALF(abfd, scnhdr_int->s_nreloc, (bfd_byte *) scnhdr_ext->s_nreloc);
  872. #endif
  873.  
  874. #if defined(I960)
  875.   PUTWORD(abfd, scnhdr_int->s_align, (bfd_byte *) scnhdr_ext->s_align);
  876. #endif
  877.   return sizeof(SCNHDR);
  878. }
  879.  
  880.  
  881. /*
  882.    initialize a section structure with information peculiar to this
  883.    particular implementation of coff
  884. */
  885.  
  886. static          boolean
  887. DEFUN(coff_new_section_hook,(abfd_ignore, section),
  888.       bfd            *abfd_ignore AND
  889.       asection       *section)
  890. {
  891.   section->alignment_power = abfd_ignore->xvec->align_power_min;
  892.   return true;
  893. }
  894.  
  895. static asection bfd_debug_section = 
  896. { "*DEBUG*" };
  897.  
  898.  
  899.  
  900. static void
  901. DEFUN(make_abs_section,(abfd),
  902.       bfd *abfd)
  903. {
  904.     
  905.  
  906.   
  907. }
  908.  
  909. /* Take a section header read from a coff file (in HOST byte order),
  910.    and make a BFD "section" out of it.  */
  911. static          boolean
  912. DEFUN(make_a_section_from_file,(abfd, hdr, target_index),
  913.       bfd            *abfd AND
  914.       struct internal_scnhdr  *hdr AND
  915.       unsigned int target_index)
  916. {
  917.   asection       *return_section;
  918.   char *name;
  919.     
  920.   /* Assorted wastage to null-terminate the name, thanks AT&T! */
  921.   name = bfd_alloc(abfd, sizeof (hdr->s_name)+1);
  922.   if (name == NULL) {
  923.       bfd_error = no_memory;
  924.       return false;
  925.     }
  926.   strncpy(name, (char *) &hdr->s_name[0], sizeof (hdr->s_name));
  927.   name[sizeof (hdr->s_name)] = 0;
  928.  
  929.   return_section = bfd_make_section(abfd, name);
  930.   if (return_section == NULL)
  931.    return false;
  932.  
  933.   /* s_paddr is presumed to be = to s_vaddr */
  934.  
  935.   return_section->vma = hdr->s_vaddr;
  936.   return_section->_raw_size = hdr->s_size;
  937.   return_section->filepos = hdr->s_scnptr;
  938.   return_section->rel_filepos =  hdr->s_relptr;
  939.   return_section->reloc_count = hdr->s_nreloc;
  940. #ifdef I960
  941.  
  942.   /* FIXME, use a temp var rather than alignment_power */
  943.   return_section->alignment_power = hdr->s_align;
  944. {
  945.   unsigned int    i;
  946.   for (i = 0; i < 32; i++) {
  947.       if ((1 << i) >= (int) (return_section->alignment_power)) {
  948.       return_section->alignment_power = i;
  949.       break;
  950.     }
  951.     }
  952. }
  953.  
  954. #endif
  955. return_section->line_filepos =  hdr->s_lnnoptr;
  956.   /*
  957.     return_section->linesize =   hdr->s_nlnno * sizeof (struct lineno);
  958.     */
  959.  
  960.   return_section->lineno_count = hdr->s_nlnno;
  961.   return_section->userdata = NULL;
  962.   return_section->next = (asection *) NULL;
  963.   return_section->flags = styp_to_sec_flags(hdr->s_flags);
  964.  
  965.   return_section->target_index = target_index;
  966.  
  967.   if (hdr->s_nreloc != 0)
  968.    return_section->flags |= SEC_RELOC;
  969.   /* FIXME: should this check 'hdr->s_size > 0' */
  970.   if (hdr->s_scnptr != 0)
  971.    return_section->flags |= SEC_HAS_CONTENTS;
  972.   return true;
  973. }
  974. static          boolean
  975. DEFUN(coff_mkobject,(abfd),
  976.       bfd            *abfd)
  977. {
  978.  abfd->tdata.coff_obj_data = (struct coff_tdata *)bfd_zalloc (abfd,sizeof(coff_data_type));
  979.   if (abfd->tdata.coff_obj_data == 0){
  980.     bfd_error = no_memory;
  981.     return false;
  982.   }
  983.   coff_data(abfd)->relocbase = 0;
  984. /*  make_abs_section(abfd);*/
  985.   return true;
  986. }
  987.  
  988. static
  989. bfd_target     *
  990. DEFUN(coff_real_object_p,(abfd, nscns, internal_f, internal_a),
  991.     bfd            *abfd AND
  992.     unsigned        nscns AND
  993.   struct internal_filehdr *internal_f AND
  994.   struct internal_aouthdr *internal_a)
  995. {
  996.   coff_data_type *coff;
  997.   enum bfd_architecture arch;
  998.   long machine;
  999.   size_t          readsize;    /* length of file_info */
  1000.   SCNHDR *external_sections;
  1001.  
  1002.   /* Build a play area */
  1003.   if (coff_mkobject(abfd) != true)
  1004.     return 0;
  1005.  
  1006.   coff = coff_data(abfd);
  1007.  
  1008.  
  1009.   external_sections = (SCNHDR *)bfd_alloc(abfd, readsize = (nscns * SCNHSZ));
  1010.  
  1011.   if (bfd_read((PTR)external_sections, 1, readsize, abfd) != readsize) {
  1012.     goto fail;
  1013.   }
  1014.  
  1015.  
  1016.   /* Now copy data as required; construct all asections etc */
  1017.   coff->symbol_index_slew = 0;
  1018.   coff->relocbase =0;
  1019.   coff->raw_syment_count = 0;
  1020.   coff->raw_linenos = 0;
  1021.   coff->raw_syments = 0;
  1022.   coff->sym_filepos =0;
  1023.   coff->flags = internal_f->f_flags;
  1024.   if (nscns != 0) {
  1025.     unsigned int    i;
  1026.     for (i = 0; i < nscns; i++) {
  1027.       struct internal_scnhdr tmp;
  1028.       coff_swap_scnhdr_in(abfd, external_sections + i, &tmp);
  1029.       make_a_section_from_file(abfd,&tmp, i+1);
  1030.     }
  1031.   }
  1032.  
  1033. /*  make_abs_section(abfd);*/
  1034.   
  1035.   /* Determine the machine architecture and type.  */
  1036. machine = 0;
  1037.   switch (internal_f->f_magic) {
  1038. #ifdef I386MAGIC
  1039.   case I386MAGIC:
  1040.     arch = bfd_arch_i386;
  1041.     machine = 0;
  1042.     break;
  1043. #endif
  1044.  
  1045. #ifdef A29K_MAGIC_BIG
  1046.   case  A29K_MAGIC_BIG:
  1047.   case  A29K_MAGIC_LITTLE:
  1048.     arch = bfd_arch_a29k;
  1049.     machine = 0;
  1050.     break;
  1051. #endif
  1052.  
  1053. #ifdef MIPS
  1054.   case  MIPS_MAGIC_1:
  1055.   case  MIPS_MAGIC_2:
  1056.   case  MIPS_MAGIC_3:
  1057.     arch = bfd_arch_mips;
  1058.     machine = 0;
  1059.     break;
  1060. #endif
  1061.  
  1062. #ifdef MC68MAGIC
  1063.   case MC68MAGIC:
  1064.   case M68MAGIC:
  1065.     arch = bfd_arch_m68k;
  1066.     machine = 68020;
  1067.     break;
  1068. #endif
  1069. #ifdef MC88MAGIC
  1070.   case MC88MAGIC:
  1071.   case MC88DMAGIC:
  1072.   case MC88OMAGIC:
  1073.     arch = bfd_arch_m88k;
  1074.     machine = 88100;
  1075.     break;
  1076. #endif
  1077. #ifdef I960
  1078. #ifdef I960ROMAGIC
  1079.   case I960ROMAGIC:
  1080.   case I960RWMAGIC:
  1081.     arch = bfd_arch_i960;
  1082.     switch (F_I960TYPE & internal_f->f_flags)
  1083.     {
  1084.     default:
  1085.     case F_I960CORE:
  1086.       machine = bfd_mach_i960_core;
  1087.       break;
  1088.     case F_I960KB:
  1089.       machine = bfd_mach_i960_kb_sb;
  1090.       break;
  1091.     case  F_I960MC:
  1092.       machine = bfd_mach_i960_mc;
  1093.       break;
  1094.     case F_I960XA:
  1095.       machine = bfd_mach_i960_xa;
  1096.       break;
  1097.     case F_I960CA:
  1098.       machine = bfd_mach_i960_ca;
  1099.       break;
  1100.     case F_I960KA:
  1101.       machine = bfd_mach_i960_ka_sa;
  1102.       break;
  1103.     }
  1104.     break;
  1105. #endif
  1106. #endif
  1107.  
  1108. #ifdef U802ROMAGIC
  1109.   case U802ROMAGIC:
  1110.   case U802WRMAGIC:
  1111.   case U802TOCMAGIC:
  1112.     arch = bfd_arch_rs6000;
  1113.     machine = 6000;
  1114.     break;
  1115. #endif
  1116.  
  1117. #ifdef H8300MAGIC
  1118.   case H8300MAGIC:
  1119.     arch = bfd_arch_h8300;
  1120.     machine = 0;
  1121.     break;
  1122. #endif
  1123.  
  1124.   default:            /* Unreadable input file type */
  1125.  arch = bfd_arch_obscure;
  1126.     break;
  1127.   }
  1128.  
  1129.   bfd_default_set_arch_mach(abfd, arch, machine);
  1130.   if (!(internal_f->f_flags & F_RELFLG))
  1131.     abfd->flags |= HAS_RELOC;
  1132.   if ((internal_f->f_flags & F_EXEC))
  1133.     abfd->flags |= EXEC_P;
  1134.   if (!(internal_f->f_flags & F_LNNO))
  1135.     abfd->flags |= HAS_LINENO;
  1136.   if (!(internal_f->f_flags & F_LSYMS))
  1137.     abfd->flags |= HAS_LOCALS;
  1138.  
  1139.  
  1140.   bfd_get_symcount(abfd) = internal_f->f_nsyms;
  1141.   if (internal_f->f_nsyms)
  1142.     abfd->flags |= HAS_SYMS;
  1143.  
  1144.   coff->sym_filepos = internal_f->f_symptr;
  1145.  
  1146.   /* These members communicate important constants about the symbol table
  1147.     to GDB's symbol-reading code.  These `constants' unfortunately vary
  1148.       from coff implementation to implementation...  */
  1149. #ifndef NO_COFF_SYMBOLS
  1150.   coff->local_n_btmask = N_BTMASK;
  1151.   coff->local_n_btshft = N_BTSHFT;
  1152.   coff->local_n_tmask  = N_TMASK;
  1153.   coff->local_n_tshift = N_TSHIFT;
  1154.   coff->local_symesz   = SYMESZ;
  1155.   coff->local_auxesz   = AUXESZ;
  1156.   coff->local_linesz   = LINESZ;
  1157. #endif
  1158.  
  1159.   coff->symbols = (coff_symbol_type *) NULL;
  1160.   bfd_get_start_address(abfd) = internal_f->f_opthdr ? internal_a->entry : 0;
  1161.  
  1162.   return abfd->xvec;
  1163.  fail:
  1164.   bfd_release(abfd, coff);
  1165.   return (bfd_target *)NULL;
  1166. }
  1167.  
  1168. static bfd_target *
  1169. DEFUN(coff_object_p,(abfd),
  1170.       bfd            *abfd)
  1171. {
  1172.   int   nscns;
  1173.   FILHDR filehdr;
  1174.   AOUTHDR opthdr;
  1175.   struct internal_filehdr internal_f;
  1176.   struct internal_aouthdr internal_a;
  1177.  
  1178.   bfd_error = system_call_error;
  1179.  
  1180.   /* figure out how much to read */
  1181.   if (bfd_read((PTR) &filehdr, 1, FILHSZ, abfd) != FILHSZ)
  1182.     return 0;
  1183.  
  1184.   bfd_swap_filehdr_in(abfd, &filehdr, &internal_f);
  1185.  
  1186.   if (BADMAG(internal_f)) {
  1187.     bfd_error = wrong_format;
  1188.     return 0;
  1189.   }
  1190.   nscns =internal_f.f_nscns;
  1191.  
  1192.   if (internal_f.f_opthdr) {
  1193.     if (bfd_read((PTR) &opthdr, 1,AOUTSZ, abfd) != AOUTSZ) {
  1194.       return 0;
  1195.     }
  1196.     bfd_swap_aouthdr_in(abfd, (char *)&opthdr, (char *)&internal_a);
  1197.   }
  1198.  
  1199.   /* Seek past the opt hdr stuff */
  1200.   bfd_seek(abfd, internal_f.f_opthdr + FILHSZ, SEEK_SET);
  1201.  
  1202.   /* if the optional header is NULL or not the correct size then
  1203.      quit; the only difference I can see between m88k dgux headers (MC88DMAGIC)
  1204.      and Intel 960 readwrite headers (I960WRMAGIC) is that the
  1205.      optional header is of a different size.
  1206.  
  1207.      But the mips keeps extra stuff in it's opthdr, so dont check
  1208.      when doing that
  1209.      */
  1210.  
  1211. #if defined(M88) || defined(I960)
  1212.   if (internal_f.f_opthdr != 0 && AOUTSZ != internal_f.f_opthdr)
  1213.     return (bfd_target *)NULL;
  1214. #endif
  1215.  
  1216.   return coff_real_object_p(abfd, nscns, &internal_f, &internal_a);
  1217. }
  1218.  
  1219.  
  1220.  
  1221. #ifndef NO_COFF_LINENOS
  1222.  
  1223. static void
  1224. DEFUN(coff_count_linenumbers,(abfd),
  1225.       bfd            *abfd)
  1226. {
  1227.   unsigned int    limit = bfd_get_symcount(abfd);
  1228.   unsigned int    i;
  1229.   asymbol       **p;
  1230.     {
  1231.       asection       *s = abfd->sections->output_section;
  1232.       while (s) {
  1233.     BFD_ASSERT(s->lineno_count == 0);
  1234.     s = s->next;
  1235.       }
  1236.     }
  1237.  
  1238.  
  1239.   for (p = abfd->outsymbols, i = 0; i < limit; i++, p++) {
  1240.     asymbol        *q_maybe = *p;
  1241.     if (q_maybe->the_bfd->xvec->flavour == bfd_target_coff_flavour) {
  1242.       coff_symbol_type *q = coffsymbol(q_maybe);
  1243.       if (q->lineno) {
  1244.     /*
  1245.       This symbol has a linenumber, increment the owning
  1246.       section's linenumber count
  1247.       */
  1248.     alent          *l = q->lineno;
  1249.     q->symbol.section->output_section->lineno_count++;
  1250.     l++;
  1251.     while (l->line_number) {
  1252.       q->symbol.section->output_section->lineno_count++;
  1253.       l++;
  1254.     }
  1255.       }
  1256.     }
  1257.   }
  1258. }
  1259.  
  1260. #endif /* NO_COFF_LINENOS */
  1261.  
  1262. #ifndef NO_COFF_SYMBOLS
  1263.  
  1264. /*
  1265.   Takes a bfd and a symbol, returns a pointer to the coff specific area
  1266.   of the symbol if there is one.
  1267.   */
  1268. static coff_symbol_type *
  1269. DEFUN(coff_symbol_from,(ignore_abfd, symbol),
  1270.       bfd            *ignore_abfd AND
  1271.       asymbol        *symbol)
  1272. {
  1273.   if (symbol->the_bfd->xvec->flavour != bfd_target_coff_flavour)
  1274.     return (coff_symbol_type *)NULL;
  1275.  
  1276.   if (symbol->the_bfd->tdata.coff_obj_data == (coff_data_type*)NULL)
  1277.     return (coff_symbol_type *)NULL;
  1278.  
  1279.   return  (coff_symbol_type *) symbol;
  1280. }
  1281.  
  1282.  
  1283.  
  1284. static void
  1285. DEFUN(fixup_symbol_value,(coff_symbol_ptr, syment),
  1286. coff_symbol_type *coff_symbol_ptr AND
  1287. struct internal_syment *syment)
  1288. {
  1289.  
  1290.   /* Normalize the symbol flags */
  1291.   if (coff_symbol_ptr->symbol.section == &bfd_com_section) {
  1292.     /* a common symbol is undefined with a value */
  1293.     syment->n_scnum = N_UNDEF;
  1294.     syment->n_value = coff_symbol_ptr->symbol.value;
  1295.   }
  1296.   else if (coff_symbol_ptr->symbol.flags & BSF_DEBUGGING) {
  1297.     syment->n_value = coff_symbol_ptr->symbol.value;
  1298.   }
  1299.   else if (coff_symbol_ptr->symbol.section == & bfd_und_section) {
  1300.     syment->n_scnum = N_UNDEF;
  1301.     syment->n_value = 0;
  1302.   }
  1303.   else {
  1304.     if (coff_symbol_ptr->symbol.section) {
  1305.       syment->n_scnum     =
  1306.        coff_symbol_ptr->symbol.section->output_section->target_index;
  1307.  
  1308.       syment->n_value =
  1309.        coff_symbol_ptr->symbol.value +
  1310.     coff_symbol_ptr->symbol.section->output_offset +
  1311.      coff_symbol_ptr->symbol.section->output_section->vma;
  1312.     }
  1313.     else {
  1314.     BFD_ASSERT(0);
  1315.       /* This can happen, but I don't know why yet (steve@cygnus.com) */
  1316.       syment->n_scnum = N_ABS;
  1317.       syment->n_value = coff_symbol_ptr->symbol.value;
  1318.     }
  1319.   }
  1320. }
  1321.  
  1322. /* run through all the symbols in the symbol table and work out what
  1323.    their indexes into the symbol table will be when output
  1324.  
  1325.  Coff requires that each C_FILE symbol points to the next one in the
  1326.  chain, and that the last one points to the first external symbol. We
  1327.  do that here too.
  1328.  
  1329. */
  1330. static void
  1331. DEFUN(coff_renumber_symbols,(bfd_ptr),
  1332.       bfd *bfd_ptr)
  1333. {
  1334.   unsigned int symbol_count = bfd_get_symcount(bfd_ptr);
  1335.   asymbol **symbol_ptr_ptr = bfd_ptr->outsymbols;
  1336.   unsigned int native_index = 0;
  1337.   struct internal_syment *last_file = (struct internal_syment *)NULL;
  1338.   unsigned int symbol_index;
  1339.   for (symbol_index = 0; symbol_index < symbol_count; symbol_index++)
  1340.       {
  1341.     coff_symbol_type *coff_symbol_ptr = coff_symbol_from(bfd_ptr, symbol_ptr_ptr[symbol_index]);
  1342.     if (coff_symbol_ptr && coff_symbol_ptr->native) {
  1343.       combined_entry_type *s = coff_symbol_ptr->native;
  1344.       int i;
  1345.  
  1346.       if (s->u.syment.n_sclass == C_FILE)
  1347.           {
  1348.         if (last_file != (struct internal_syment *)NULL) {
  1349.           last_file->n_value = native_index;
  1350.         }
  1351.         last_file = &(s->u.syment);
  1352.           }
  1353.       else {
  1354.  
  1355.         /* Modify the symbol values according to their section and
  1356.            type */
  1357.  
  1358.         fixup_symbol_value(coff_symbol_ptr, &(s->u.syment));
  1359.       }
  1360.       for (i = 0; i < s->u.syment.n_numaux + 1; i++) {
  1361.         s[i].offset = native_index ++;
  1362.       }
  1363.     }
  1364.     else {
  1365.       native_index++;
  1366.     }
  1367.       }
  1368. }
  1369.  
  1370.  
  1371. /*
  1372.  Run thorough the symbol table again, and fix it so that all pointers to
  1373.  entries are changed to the entries' index in the output symbol table.
  1374.  
  1375. */
  1376. static void
  1377. DEFUN(coff_mangle_symbols,(bfd_ptr),
  1378.       bfd *bfd_ptr)
  1379. {
  1380.   unsigned int symbol_count = bfd_get_symcount(bfd_ptr);
  1381.   asymbol **symbol_ptr_ptr = bfd_ptr->outsymbols;
  1382.   unsigned int symbol_index;
  1383.  
  1384.   for (symbol_index = 0; symbol_index < symbol_count; symbol_index++)
  1385.       {
  1386.     coff_symbol_type *coff_symbol_ptr =
  1387.       coff_symbol_from(bfd_ptr, symbol_ptr_ptr[symbol_index]);
  1388.  
  1389.     if (coff_symbol_ptr && coff_symbol_ptr->native) {
  1390.       int i;
  1391.       combined_entry_type *s = coff_symbol_ptr->native;
  1392.  
  1393.       for (i = 0; i < s->u.syment.n_numaux ; i++) {
  1394.         combined_entry_type *a = s + i + 1;
  1395.         if (a->fix_tag) {
  1396.           a->u.auxent.x_sym.x_tagndx.l =
  1397.         a->u.auxent.x_sym.x_tagndx.p->offset;
  1398.           a->fix_tag = 0;
  1399.         }
  1400.         if (a->fix_end) {
  1401.           a->u.auxent.x_sym.x_fcnary.x_fcn.x_endndx.l =
  1402.         a->u.auxent.x_sym.x_fcnary.x_fcn.x_endndx.p->offset;
  1403.           a->fix_end = 0;
  1404.           
  1405.         }
  1406.  
  1407.       }
  1408.     }
  1409.       }
  1410. }
  1411.  
  1412. static int string_size;
  1413. static void
  1414. DEFUN(coff_fix_symbol_name,(ignore_abfd, symbol, native),
  1415.   bfd *ignore_abfd AND
  1416.   asymbol *symbol AND
  1417.   combined_entry_type *native)
  1418. {
  1419.   unsigned int    name_length;
  1420.   union internal_auxent *auxent;
  1421.   char *  name = ( char *)(symbol->name);
  1422.  
  1423.   if (name == (char *) NULL) {
  1424.     /* coff symbols always have names, so we'll make one up */
  1425.     symbol->name = "strange";
  1426.     name = (char *)symbol->name;
  1427.   }
  1428.   name_length = strlen(name);
  1429.  
  1430.   if (native->u.syment.n_sclass == C_FILE) {
  1431.     strncpy(native->u.syment._n._n_name, ".file", SYMNMLEN);
  1432.     auxent = &(native+1)->u.auxent;
  1433.  
  1434. #ifdef COFF_LONG_FILENAMES
  1435.     if (name_length <= FILNMLEN) {
  1436.       strncpy(auxent->x_file.x_fname, name, FILNMLEN);
  1437.     }
  1438.     else {
  1439.       auxent->x_file.x_n.x_offset = string_size + 4;
  1440.       auxent->x_file.x_n.x_zeroes = 0;
  1441.       string_size += name_length + 1;
  1442.     }
  1443. #else
  1444.     strncpy(auxent->x_file.x_fname, name, FILNMLEN);
  1445.     if (name_length > FILNMLEN) {
  1446.       name[FILNMLEN] = '\0';
  1447.     }
  1448. #endif
  1449.   }
  1450.   else
  1451.       {                /* NOT A C_FILE SYMBOL */
  1452.     if (name_length <= SYMNMLEN) {
  1453.       /* This name will fit into the symbol neatly */
  1454.       strncpy(native->u.syment._n._n_name, symbol->name, SYMNMLEN);
  1455.     }
  1456.     else {
  1457.       native->u.syment._n._n_n._n_offset =  string_size + 4;
  1458.       native->u.syment._n._n_n._n_zeroes = 0;
  1459.       string_size += name_length + 1;
  1460.     }
  1461.       }
  1462. }
  1463.  
  1464.  
  1465.  
  1466. static unsigned int
  1467. DEFUN(coff_write_symbol,(abfd, symbol, native, written),
  1468. bfd *abfd AND
  1469. asymbol *symbol AND
  1470. combined_entry_type *native AND
  1471. unsigned int written)
  1472. {
  1473.   unsigned int    numaux = native->u.syment.n_numaux;
  1474.   int             type = native->u.syment.n_type;
  1475.   int             class =  native->u.syment.n_sclass;
  1476.   SYMENT buf;
  1477.   unsigned int j;
  1478.   if (symbol->section == &bfd_abs_section) 
  1479.   {
  1480.     native->u.syment.n_scnum = N_ABS;
  1481.   }
  1482.   else if (symbol->section == &bfd_debug_section) 
  1483.   {
  1484.     native->u.syment.n_scnum = N_DEBUG;
  1485.   }
  1486.   else if (symbol->section == &bfd_und_section)   
  1487.   {
  1488.     native->u.syment.n_scnum = N_UNDEF;
  1489.   }
  1490.   else 
  1491.   {
  1492.     native->u.syment.n_scnum =
  1493.      symbol->section->output_section->target_index;
  1494.   }
  1495.   
  1496.   
  1497.   coff_fix_symbol_name(abfd, symbol, native);
  1498.  
  1499.   coff_swap_sym_out(abfd, &native->u.syment, &buf);
  1500.   bfd_write((PTR)& buf, 1, SYMESZ, abfd);
  1501.   for (j = 0; j < native->u.syment.n_numaux;  j++)
  1502.   {
  1503.     AUXENT buf1;
  1504.     bzero((PTR)&buf, AUXESZ);
  1505.     coff_swap_aux_out(abfd,
  1506.               &( (native + j + 1)->u.auxent), type, class, &buf1);
  1507.     bfd_write((PTR) (&buf1), 1, AUXESZ, abfd);
  1508.   }
  1509.   /*
  1510.     Reuse somewhere in the symbol to keep the index
  1511.     */
  1512.   set_index(symbol, written);
  1513.   return   written + 1 + numaux;
  1514. }
  1515.  
  1516.  
  1517. static unsigned int
  1518. DEFUN(coff_write_alien_symbol,(abfd, symbol, written),
  1519.       bfd *abfd AND
  1520.       asymbol *symbol AND
  1521.       unsigned int written)
  1522. {
  1523.   /*
  1524.     This symbol has been created by the loader, or come from a non
  1525.     coff format. It  has no native element to inherit, make our
  1526.     own
  1527.     */
  1528.   combined_entry_type *native;
  1529.   combined_entry_type dummy;
  1530.   native = &dummy;
  1531.   native->u.syment.n_type =  T_NULL;
  1532. #ifdef I960
  1533.   native->u.syment.n_flags =  0;
  1534. #endif
  1535.   if (symbol->section == &bfd_und_section) 
  1536.   {
  1537.       native->u.syment.n_scnum =  N_UNDEF;
  1538.       native->u.syment.n_value =  symbol->value;
  1539.     }
  1540.   else if (symbol->section == &bfd_com_section) 
  1541.   {
  1542.       native->u.syment.n_scnum =  N_UNDEF;
  1543.       native->u.syment.n_value =  symbol->value;
  1544.  
  1545.   }
  1546.   
  1547.   else if (symbol->flags & BSF_DEBUGGING) {
  1548.       /*
  1549.     remove name so it doesn't take up any space
  1550.     */
  1551.       symbol->name = "";
  1552.     }
  1553.   else {
  1554.       native->u.syment.n_scnum  =   symbol->section->output_section->target_index;
  1555.       native->u.syment.n_value =   symbol->value +
  1556.        symbol->section->output_section->vma +
  1557.     symbol->section->output_offset;
  1558. #ifdef I960
  1559.       /* Copy the any flags from the the file hdr into the symbol  */
  1560.     {
  1561.       coff_symbol_type *c = coff_symbol_from(abfd, symbol);
  1562.       if (c != (coff_symbol_type *)NULL) {
  1563.       native->u.syment.n_flags =   c->symbol.the_bfd->flags;
  1564.     }
  1565.     }
  1566. #endif
  1567.     }
  1568.  
  1569. #ifdef HASPAD1
  1570.   native->u.syment.pad1[0] = 0;
  1571.   native->u.syment.pad1[0] = 0;
  1572. #endif
  1573.  
  1574.   native->u.syment.n_type =  0;
  1575.   if (symbol->flags & BSF_LOCAL)
  1576.    native->u.syment.n_sclass =  C_STAT;
  1577.   else
  1578.    native->u.syment.n_sclass =  C_EXT;
  1579.   native->u.syment.n_numaux =  0;
  1580.  
  1581.   return   coff_write_symbol(abfd, symbol, native, written);
  1582. }
  1583.  
  1584. static unsigned int
  1585. DEFUN(coff_write_native_symbol,(abfd, symbol,   written),
  1586. bfd *abfd AND
  1587. coff_symbol_type *symbol AND
  1588. unsigned int written)
  1589. {
  1590.   /*
  1591.     Does this symbol have an ascociated line number - if so then
  1592.     make it remember this symbol index. Also tag the auxent of
  1593.     this symbol to point to the right place in the lineno table
  1594.     */
  1595.   combined_entry_type *native = symbol->native;
  1596.  
  1597.   alent          *lineno = symbol->lineno;
  1598.  
  1599.   if (lineno && !symbol->done_lineno) {
  1600.     unsigned int    count = 0;
  1601.     lineno[count].u.offset = written;
  1602.     if (native->u.syment.n_numaux) {
  1603.       union internal_auxent  *a = &((native+1)->u.auxent);
  1604.  
  1605.       a->x_sym.x_fcnary.x_fcn.x_lnnoptr =
  1606.     symbol->symbol.section->output_section->moving_line_filepos;
  1607.     }
  1608.     /*
  1609.       And count and relocate all other linenumbers
  1610.       */
  1611.  
  1612.     count++;
  1613.     while (lineno[count].line_number) {
  1614.       lineno[count].u.offset +=
  1615.     symbol->symbol.section->output_section->vma +
  1616.       symbol->symbol.section->output_offset;
  1617.       count++;
  1618.     }
  1619.     symbol->done_lineno = true;
  1620.     
  1621.     symbol->symbol.section->output_section->moving_line_filepos +=
  1622.       count * LINESZ;
  1623.   }
  1624.   return coff_write_symbol(abfd, &( symbol->symbol), native,written);
  1625. }
  1626.  
  1627. static void
  1628. DEFUN(coff_write_symbols,(abfd),
  1629.       bfd            *abfd)
  1630. {
  1631.   unsigned int    i;
  1632.   unsigned int    limit = bfd_get_symcount(abfd);
  1633.   unsigned int    written = 0;
  1634.  
  1635.   asymbol       **p;
  1636.  
  1637.   string_size = 0;
  1638.  
  1639.  
  1640.   /* Seek to the right place */
  1641.   bfd_seek(abfd, obj_sym_filepos(abfd), SEEK_SET);
  1642.  
  1643.   /* Output all the symbols we have */
  1644.  
  1645.   written = 0;
  1646.   for (p = abfd->outsymbols, i = 0; i < limit; i++, p++)
  1647.       {
  1648.     asymbol        *symbol = *p;
  1649.     coff_symbol_type *c_symbol = coff_symbol_from(abfd, symbol);
  1650.  
  1651.     if (c_symbol == (coff_symbol_type *) NULL ||
  1652.         c_symbol->native == (combined_entry_type *)NULL)
  1653.         {
  1654.           written = coff_write_alien_symbol(abfd, symbol, written);
  1655.         }
  1656.     else
  1657.         {
  1658.           written = coff_write_native_symbol(abfd, c_symbol, written);
  1659.         }
  1660.  
  1661.       }
  1662.  
  1663.   bfd_get_symcount(abfd) = written;
  1664.  
  1665.   /* Now write out strings */
  1666.  
  1667.   if (string_size != 0)
  1668.    {
  1669.      unsigned int    size = string_size + 4;
  1670.      bfd_byte buffer[4];
  1671.  
  1672.      bfd_h_put_32(abfd, size, buffer);
  1673.      bfd_write((PTR) buffer, 1, sizeof(buffer), abfd);
  1674.      for (p = abfd->outsymbols, i = 0;
  1675.       i < limit;
  1676.       i++, p++)
  1677.      {
  1678.        asymbol        *q = *p;
  1679.        size_t          name_length = strlen(q->name);
  1680.        int maxlen;
  1681.        coff_symbol_type*       c_symbol = coff_symbol_from(abfd, q);
  1682.        maxlen = ((c_symbol != NULL && c_symbol->native != NULL) &&
  1683.              (c_symbol->native->u.syment.n_sclass == C_FILE)) ?
  1684.          FILNMLEN : SYMNMLEN;
  1685.  
  1686.        if (name_length > maxlen) {
  1687.          bfd_write((PTR) (q->name), 1, name_length + 1, abfd);
  1688.        }
  1689.      }
  1690.    }
  1691.   else {
  1692.     /* We would normally not write anything here, but we'll write
  1693.        out 4 so that any stupid coff reader which tries to read
  1694.        the string table even when there isn't one won't croak.
  1695.        */
  1696.  
  1697.     uint32e_type size = 4;
  1698.     size =  size;
  1699.     bfd_write((PTR)&size, 1, sizeof(size), abfd);
  1700.  
  1701.   }
  1702. }
  1703.  
  1704. /*
  1705. SUBSUBSECTION
  1706.     Writing Relocations
  1707.  
  1708.     To write relocations, all the back end does is step though the
  1709.     canonical relocation table, and create an
  1710.     @code{internal_reloc}. The symbol index to use is removed from
  1711.     the @code{offset} field in the symbol table supplied, the
  1712.     address comes directly from the sum of the section base
  1713.     address and the relocation offset and the type is dug directly
  1714.     from the howto field.  Then the @code{internal_reloc} is
  1715.     swapped into the shape of an @code{external_reloc} and written
  1716.     out to disk. 
  1717.  
  1718. */
  1719.  
  1720. static void
  1721. DEFUN(coff_write_relocs,(abfd),
  1722.       bfd            *abfd)
  1723. {
  1724.   asection       *s;
  1725.   for (s = abfd->sections; s != (asection *) NULL; s = s->next) {
  1726.     unsigned int    i;
  1727.     struct external_reloc dst;
  1728.  
  1729.     arelent       **p = s->orelocation;
  1730.     bfd_seek(abfd, s->rel_filepos, SEEK_SET);
  1731.     for (i = 0; i < s->reloc_count; i++) {
  1732.       struct internal_reloc    n;
  1733.       arelent        *q = p[i];
  1734.       memset((PTR)&n, 0, sizeof(n));
  1735.       n.r_vaddr = q->address + s->vma;
  1736.       if (q->sym_ptr_ptr) {
  1737.     n.r_symndx = get_index((*(q->sym_ptr_ptr)));
  1738.       }
  1739. #ifdef SELECT_RELOC
  1740.       /* Work out reloc type from what is required */
  1741.       SELECT_RELOC(n.r_type, q->howto);
  1742. #else
  1743.       n.r_type = q->howto->type;
  1744. #endif
  1745.       coff_swap_reloc_out(abfd, &n, &dst);
  1746.       bfd_write((PTR) &n, 1, RELSZ, abfd);
  1747.     }
  1748.   }
  1749. }
  1750. #endif /* NO_COFF_SYMBOLS */
  1751.  
  1752. #ifndef NO_COFF_LINENOS
  1753.  
  1754. static void
  1755. DEFUN(coff_write_linenumbers,(abfd),
  1756.       bfd            *abfd)
  1757. {
  1758.   asection       *s;
  1759.   for (s = abfd->sections; s != (asection *) NULL; s = s->next) {
  1760.     if (s->lineno_count) {
  1761.       asymbol       **q = abfd->outsymbols;
  1762.       bfd_seek(abfd, s->line_filepos, SEEK_SET);
  1763.       /* Find all the linenumbers in this section */
  1764.       while (*q) {
  1765.     asymbol        *p = *q;
  1766.     alent          *l = BFD_SEND(p->the_bfd, _get_lineno, (p->the_bfd, p));
  1767.     if (l) {
  1768.       /* Found a linenumber entry, output */
  1769.       struct internal_lineno  out;
  1770.       LINENO buff;
  1771.       memset( (PTR)&out, 0, sizeof(out));
  1772.       out.l_lnno = 0;
  1773.       out.l_addr.l_symndx = l->u.offset;
  1774.       coff_swap_lineno_out(abfd, &out, &buff);
  1775.       bfd_write((PTR) &buff, 1, LINESZ, abfd);
  1776.       l++;
  1777.       while (l->line_number) {
  1778.         out.l_lnno = l->line_number;
  1779.         out.l_addr.l_symndx = l->u.offset;
  1780.         coff_swap_lineno_out(abfd, &out, &buff);
  1781.         bfd_write((PTR) &buff, 1, LINESZ, abfd);
  1782.         l++;
  1783.       }
  1784.     }
  1785.     q++;
  1786.       }
  1787.     }
  1788.   }
  1789. }
  1790.  
  1791. static alent   *
  1792. DEFUN(coff_get_lineno,(ignore_abfd, symbol),
  1793.       bfd            *ignore_abfd AND
  1794.       asymbol        *symbol)
  1795. {
  1796.   return coffsymbol(symbol)->lineno;
  1797. }
  1798.  
  1799. #endif /* NO_COFF_LINENOS */
  1800.  
  1801. static asymbol *
  1802. coff_make_empty_symbol(abfd)
  1803. bfd            *abfd;
  1804. {
  1805.   coff_symbol_type *new = (coff_symbol_type *) bfd_alloc(abfd, sizeof(coff_symbol_type));
  1806.   if (new == NULL) {
  1807.     bfd_error = no_memory;
  1808.     return (NULL);
  1809.   }                /* on error */
  1810.   new->native = 0;
  1811.   new->lineno = (alent *) NULL;
  1812.   new->done_lineno = false;
  1813.   new->symbol.the_bfd = abfd;
  1814.   return &new->symbol;
  1815. }
  1816.  
  1817. #ifndef NO_COFF_SYMBOLS
  1818.  
  1819. static void
  1820. DEFUN(coff_print_symbol,(ignore_abfd, filep, symbol, how),
  1821.       bfd            *ignore_abfd AND
  1822.       PTR           filep AND
  1823.       asymbol        *symbol AND
  1824.       bfd_print_symbol_type how)
  1825. {
  1826.   FILE *file = (FILE *)filep;
  1827.   switch (how) {
  1828.     case bfd_print_symbol_name:
  1829.       fprintf(file, "%s", symbol->name);
  1830.       break;
  1831.     case bfd_print_symbol_more:
  1832.       fprintf(file, "coff %lx %lx", (unsigned long) coffsymbol(symbol)->native,
  1833.           (unsigned long) coffsymbol(symbol)->lineno);
  1834.       break;
  1835.     case bfd_print_symbol_nm:
  1836.  
  1837.     {
  1838.       CONST char *section_name = symbol->section->name;
  1839.       bfd_print_symbol_vandf((PTR) file, symbol);
  1840.  
  1841.     
  1842.       fprintf(file, " %-5s %s %s %s",
  1843.           section_name,
  1844.           coffsymbol(symbol)->native ? "n" : "g",
  1845.           coffsymbol(symbol)->lineno ? "l" : " ",
  1846.           symbol->name);
  1847.     }
  1848.  
  1849.  
  1850.       break;
  1851.     case bfd_print_symbol_all:
  1852.       /* Print out the symbols in a reasonable way */
  1853.     {
  1854.       CONST char *section_name = symbol->section->name;
  1855.  
  1856.  
  1857.       if (coffsymbol(symbol)->native) 
  1858.       {
  1859.     unsigned int aux;
  1860.     combined_entry_type *combined = coffsymbol(symbol)->native;
  1861.     combined_entry_type *root = obj_raw_syments(ignore_abfd);
  1862.     
  1863.     fprintf(file,"[%3d]",
  1864.         combined - root);
  1865.     
  1866.  
  1867.     fprintf(file, "(sc %2d)(fl%4x)(ty%3x)(sc%3d) nx(%d) %08x %s",
  1868.         combined->u.syment.n_scnum,
  1869.         combined->u.syment.n_flags,
  1870.         combined->u.syment.n_type,
  1871.         combined->u.syment.n_sclass,
  1872.         combined->u.syment.n_numaux,
  1873.         combined->u.syment.n_value,
  1874.         symbol->name
  1875.         );
  1876.     for (aux = 0; aux < combined->u.syment.n_numaux; aux++) 
  1877.     {
  1878.       fprintf(file,"\n");
  1879.       switch (combined->u.syment.n_sclass) {
  1880.         case C_FILE:
  1881.           fprintf(file, "File ");
  1882.           break;
  1883.         default:
  1884.           fprintf(file, "AUX lnno %x size %x tagndx %x",
  1885.               combined[aux+1].u.auxent.x_sym.x_misc.x_lnsz.x_lnno,
  1886.               combined[aux+1].u.auxent.x_sym.x_misc.x_lnsz.x_size,
  1887.               combined[aux+1].u.auxent.x_sym.x_tagndx.l);
  1888.           break;
  1889.     
  1890.         }
  1891.  
  1892.     }
  1893.     
  1894.       {
  1895.     struct lineno_cache_entry *l = coffsymbol(symbol)->lineno;
  1896.     if (l) 
  1897.     {
  1898.       printf("\n%s :", l->u.sym->name);
  1899.       l++;
  1900.       while (l->line_number) 
  1901.       {
  1902.         printf("\n%4d : %x", 
  1903.            l->line_number,
  1904.            l->u.offset);
  1905.         l++;
  1906.         
  1907.       }
  1908.     }
  1909.       }
  1910.  
  1911.     
  1912.  
  1913.       } 
  1914.  
  1915.       else {
  1916.       bfd_print_symbol_vandf((PTR) file, symbol);
  1917.       fprintf(file, " %-5s %s %s %s",
  1918.           section_name,
  1919.           coffsymbol(symbol)->native ? "n" : "g",
  1920.           coffsymbol(symbol)->lineno ? "l" : " ",
  1921.           symbol->name);
  1922.     }
  1923.  
  1924.     }
  1925.     
  1926.     }
  1927. }
  1928.  
  1929. #endif /* NO_COFF_SYMBOLS */
  1930.  
  1931. /* Set flags and magic number of a coff file from architecture and machine
  1932.    type.  Result is true if we can represent the arch&type, false if not.  */
  1933.  
  1934. static          boolean
  1935. DEFUN(coff_set_flags,(abfd, magicp, flagsp),
  1936.       bfd            *abfd AND
  1937.       unsigned       *magicp AND
  1938.       unsigned short *flagsp)
  1939. {
  1940.   switch (bfd_get_arch(abfd)) {
  1941.  
  1942. #ifdef I960ROMAGIC
  1943.  
  1944.     case bfd_arch_i960:
  1945.  
  1946.       {
  1947.     unsigned        flags;
  1948.     *magicp = I960ROMAGIC;
  1949.     /*
  1950.       ((bfd_get_file_flags(abfd) & WP_TEXT) ? I960ROMAGIC :
  1951.       I960RWMAGIC);   FIXME???
  1952.       */
  1953.     switch (bfd_get_mach(abfd)) {
  1954.     case bfd_mach_i960_core:
  1955.       flags = F_I960CORE;
  1956.       break;
  1957.     case bfd_mach_i960_kb_sb:
  1958.       flags = F_I960KB;
  1959.       break;
  1960.     case bfd_mach_i960_mc:
  1961.       flags = F_I960MC;
  1962.       break;
  1963.     case bfd_mach_i960_xa:
  1964.       flags = F_I960XA;
  1965.       break;
  1966.     case bfd_mach_i960_ca:
  1967.       flags = F_I960CA;
  1968.       break;
  1969.     case bfd_mach_i960_ka_sa:
  1970.       flags = F_I960KA;
  1971.       break;
  1972.     default:
  1973.       return false;
  1974.     }
  1975.     *flagsp = flags;
  1976.     return true;
  1977.       }
  1978.     break;
  1979. #endif
  1980. #ifdef MIPS
  1981.   case bfd_arch_mips:
  1982.     *magicp = MIPS_MAGIC_2;
  1983.     return true;
  1984.     break;
  1985. #endif
  1986. #ifdef I386MAGIC
  1987.   case bfd_arch_i386:
  1988.     *magicp = I386MAGIC;
  1989.     return true;
  1990. #endif
  1991. #ifdef MC68MAGIC
  1992.   case bfd_arch_m68k:
  1993.     *magicp = MC68MAGIC;
  1994.     return true;
  1995. #endif
  1996.  
  1997. #ifdef MC88MAGIC
  1998.     case bfd_arch_m88k:
  1999.       *magicp = MC88OMAGIC;
  2000.       return true;
  2001.       break;
  2002. #endif
  2003. #ifdef H8300MAGIC
  2004.     case bfd_arch_h8300:
  2005.       *magicp = H8300MAGIC;
  2006.       return true;
  2007.       break;
  2008. #endif
  2009. #ifdef A29K_MAGIC_BIG
  2010.     case bfd_arch_a29k:
  2011.       if (abfd->xvec->byteorder_big_p)
  2012.        *magicp = A29K_MAGIC_BIG;
  2013.       else
  2014.        *magicp = A29K_MAGIC_LITTLE;
  2015.       return true;
  2016.       break;
  2017. #endif
  2018.  
  2019. #ifdef U802TOCMAGIC
  2020.   case bfd_arch_rs6000:
  2021.     *magicp = U802TOCMAGIC;
  2022.     break;
  2023. #endif
  2024.  
  2025.   default:            /* Unknown architecture */
  2026.     /* return false;  -- fall through to "return false" below, to avoid
  2027.        "statement never reached" errors on the one below. */
  2028.     break;
  2029.   }
  2030.  
  2031.   return false;
  2032. }
  2033.  
  2034.  
  2035. static          boolean
  2036. DEFUN(coff_set_arch_mach,(abfd, arch, machine),
  2037.       bfd            *abfd AND
  2038.       enum bfd_architecture arch AND
  2039.       unsigned long   machine)
  2040. {
  2041.   unsigned        dummy1;
  2042.   unsigned     short dummy2;
  2043.   bfd_default_set_arch_mach(abfd, arch, machine);
  2044.  
  2045.   if (arch != bfd_arch_unknown &&
  2046.       coff_set_flags(abfd, &dummy1, &dummy2) != true)
  2047.     return false;        /* We can't represent this type */
  2048.   return true;            /* We're easy ... */
  2049. }
  2050.  
  2051.  
  2052. /* Calculate the file position for each section. */
  2053.  
  2054. static void
  2055. DEFUN(coff_compute_section_file_positions,(abfd),
  2056.       bfd            *abfd)
  2057. {
  2058.   asection       *current;
  2059.   asection    *previous = (asection *)NULL;
  2060.   file_ptr        sofar = FILHSZ;
  2061.   file_ptr    old_sofar;
  2062.   if (bfd_get_start_address(abfd)) 
  2063.   {
  2064.     /*  A start address may have been added to the original file. In this
  2065.     case it will need an optional header to record it.  */
  2066.     abfd->flags |= EXEC_P;
  2067.   }
  2068.  
  2069.   if (abfd->flags & EXEC_P)
  2070.    sofar += AOUTSZ;
  2071.  
  2072.   sofar += abfd->section_count * SCNHSZ;
  2073.   for (current = abfd->sections;
  2074.        current != (asection *)NULL;
  2075.        current = current->next) {
  2076.  
  2077.       /* Only deal with sections which have contents */
  2078.       if (!(current->flags & SEC_HAS_CONTENTS))
  2079.        continue;
  2080.  
  2081.       /* Align the sections in the file to the same boundary on
  2082.      which they are aligned in virtual memory.  I960 doesn't
  2083.      do this (FIXME) so we can stay in sync with Intel.  960
  2084.      doesn't yet page from files... */
  2085. #ifndef I960
  2086.     {
  2087.       /* make sure this section is aligned on the right boundary - by
  2088.      padding the previous section up if necessary */
  2089.  
  2090.       old_sofar= sofar;
  2091.       sofar = BFD_ALIGN(sofar, 1 << current->alignment_power);
  2092.       if (previous != (asection *)NULL) {
  2093.       previous->_raw_size += sofar - old_sofar;
  2094.     }
  2095.     }
  2096.  
  2097. #endif
  2098.       /* FIXME, in demand paged files, the low order bits of the file
  2099.      offset must match the low order bits of the virtual address.
  2100.      "Low order" is apparently implementation defined.  Add code
  2101.      here to round sofar up to match the virtual address.  */
  2102.  
  2103.       current->filepos = sofar;
  2104.  
  2105.       /* make sure that this section is of the right size too */
  2106.       old_sofar =  sofar += current->_raw_size;
  2107.       sofar = BFD_ALIGN(sofar, 1 << current->alignment_power);
  2108.       current->_raw_size += sofar - old_sofar ;
  2109.  
  2110.       previous = current;
  2111.     }
  2112.   obj_relocbase(abfd) = sofar;
  2113. }
  2114.  
  2115.  
  2116.  
  2117.  
  2118. /* SUPPRESS 558 */
  2119. /* SUPPRESS 529 */
  2120. static          boolean
  2121. DEFUN(coff_write_object_contents,(abfd),
  2122.       bfd            *abfd)
  2123. {
  2124.   asection       *current;
  2125.   unsigned int count;
  2126.   
  2127.   boolean         hasrelocs = false;
  2128.   boolean         haslinno = false;
  2129.   file_ptr        reloc_base;
  2130.   file_ptr        lineno_base;
  2131.   file_ptr        sym_base;
  2132.   file_ptr        scn_base;
  2133.   file_ptr        data_base;
  2134.   unsigned long   reloc_size = 0;
  2135.   unsigned long   lnno_size = 0;
  2136.   asection       *text_sec = NULL;
  2137.   asection       *data_sec = NULL;
  2138.   asection       *bss_sec = NULL;
  2139.  
  2140.   struct internal_filehdr internal_f;
  2141.   struct internal_aouthdr internal_a;
  2142.  
  2143.  
  2144.   bfd_error = system_call_error;
  2145.   /* Number the output sections, starting from one on the first section
  2146.      with a name which doesn't start with a * */
  2147.   count = 1;
  2148.   for (current = abfd->sections; current != (asection *)NULL; 
  2149.        current = current->next) 
  2150.   {
  2151.       current->target_index = count;
  2152.   }
  2153.   
  2154.     
  2155.  
  2156.  
  2157.  
  2158.   if(abfd->output_has_begun == false) {
  2159.       coff_compute_section_file_positions(abfd);
  2160.     }
  2161.  
  2162.   if (abfd->sections != (asection *)NULL) {
  2163.       scn_base = abfd->sections->filepos;
  2164.     }
  2165.   else {
  2166.       scn_base = 0;
  2167.     }
  2168.   if (bfd_seek(abfd, scn_base, SEEK_SET) != 0)
  2169.    return false;
  2170.   reloc_base = obj_relocbase(abfd);
  2171.  
  2172.   /* Make a pass through the symbol table to count line number entries and
  2173.      put them into the correct asections */
  2174.  
  2175. #ifndef NO_COFF_LINENOS
  2176.   coff_count_linenumbers(abfd);
  2177. #endif
  2178.   data_base = scn_base;
  2179.  
  2180.   /* Work out the size of the reloc and linno areas */
  2181.  
  2182.   for (current = abfd->sections; current != NULL; current =
  2183.        current->next) 
  2184.   {
  2185.     /* We give section headers to +ve indexes */
  2186.     if (current->target_index > 0) 
  2187.     {
  2188.     
  2189.       reloc_size += current->reloc_count * RELSZ;
  2190. #ifndef NO_COFF_LINENOS
  2191.       lnno_size += current->lineno_count * LINESZ;
  2192. #endif
  2193.       data_base += SCNHSZ;
  2194.     }
  2195.       
  2196.   }
  2197.  
  2198.   lineno_base = reloc_base + reloc_size;
  2199.   sym_base = lineno_base + lnno_size;
  2200.  
  2201.   /* Indicate in each section->line_filepos its actual file address */
  2202.   for (current = abfd->sections; current != NULL; current =
  2203.        current->next) 
  2204.   {
  2205.     if (current->target_index > 0) 
  2206.     {
  2207.     
  2208.       if (current->lineno_count) {
  2209.       current->line_filepos = lineno_base;
  2210.       current->moving_line_filepos = lineno_base;
  2211. #ifndef NO_COFF_LINENOS
  2212.       lineno_base += current->lineno_count * LINESZ;
  2213. #endif
  2214.     }
  2215.       else {
  2216.       current->line_filepos = 0;
  2217.     }
  2218.       if (current->reloc_count) {
  2219.       current->rel_filepos = reloc_base;
  2220.       reloc_base += current->reloc_count * sizeof(struct internal_reloc);
  2221.     }
  2222.       else {
  2223.       current->rel_filepos = 0;
  2224.     }
  2225.     }
  2226.   }    
  2227.       
  2228.  
  2229.  
  2230.   /* Write section headers to the file.  */
  2231.   internal_f.f_nscns = 0;
  2232.   bfd_seek(abfd,
  2233.        (file_ptr) ((abfd->flags & EXEC_P) ?
  2234.                (FILHSZ + AOUTSZ) : FILHSZ),
  2235.        SEEK_SET);
  2236.  
  2237. {
  2238. #if 0
  2239.   unsigned int    pad = abfd->flags & D_PAGED ? data_base : 0;
  2240. #endif
  2241.   unsigned int    pad = 0;
  2242.  
  2243.   for (current = abfd->sections;
  2244.        current != NULL;
  2245.        current = current->next) {
  2246.       struct internal_scnhdr section;
  2247.       if (current->target_index > 0) 
  2248.       {
  2249.     internal_f.f_nscns ++;
  2250.     strncpy(&(section.s_name[0]), current->name, 8);
  2251.     section.s_vaddr = current->vma + pad;
  2252.     section.s_paddr = current->vma + pad;
  2253.     section.s_size = current->_raw_size - pad;
  2254.     /*
  2255.       If this section has no size or is unloadable then the scnptr
  2256.       will be 0 too
  2257.       */
  2258.     if (current->_raw_size - pad == 0 ||
  2259.         (current->flags & SEC_LOAD) == 0) {
  2260.         section.s_scnptr = 0;
  2261.       }
  2262.     else {
  2263.         section.s_scnptr = current->filepos;
  2264.       }
  2265.     section.s_relptr = current->rel_filepos;
  2266.     section.s_lnnoptr = current->line_filepos;
  2267.     section.s_nreloc = current->reloc_count;
  2268.     section.s_nlnno = current->lineno_count;
  2269.     if (current->reloc_count != 0)
  2270.      hasrelocs = true;
  2271.     if (current->lineno_count != 0)
  2272.      haslinno = true;
  2273.  
  2274.     section.s_flags = sec_to_styp_flags(current->name,current->flags);
  2275.  
  2276.     if (!strcmp(current->name, _TEXT)) {
  2277.         text_sec = current;
  2278.       } else if (!strcmp(current->name, _DATA)) {
  2279.           data_sec = current;
  2280.         } else if (!strcmp(current->name, _BSS)) {
  2281.         bss_sec = current;
  2282.           }
  2283.  
  2284. #ifdef I960
  2285.     section.s_align = (current->alignment_power
  2286.                ? 1 << current->alignment_power
  2287.                : 0);
  2288.  
  2289. #endif
  2290.       {
  2291.     SCNHDR          buff;
  2292.  
  2293.     coff_swap_scnhdr_out(abfd, §ion, &buff);
  2294.     bfd_write((PTR) (&buff), 1, SCNHSZ, abfd);
  2295.  
  2296.       }
  2297.  
  2298.     pad = 0;
  2299.       }
  2300.     }    
  2301. }
  2302.  
  2303.  
  2304.   /* OK, now set up the filehdr... */
  2305.  
  2306.   /* Don't include the internal abs section in the section count */
  2307.  
  2308.   /*
  2309.     We will NOT put a fucking timestamp in the header here. Every time you
  2310.     put it back, I will come in and take it out again. I'm sorry. This
  2311.     field does not belong here.  We fill it with a 0 so it compares the
  2312.     same but is not a reasonable time. -- gnu@cygnus.com
  2313.     */
  2314.   /*
  2315.     Well, I like it, and now we have *customers* who have requested it,
  2316.     so I'm conditionally compiling it in.
  2317.  
  2318.     sac@cygnus.com
  2319.     */
  2320. #ifndef NOCOFF_TIMESTAMP
  2321.   internal_f.f_timdat = time(0);
  2322. #else
  2323.   internal_f.f_timdat = 0;
  2324. #endif
  2325.  
  2326.   if (bfd_get_symcount(abfd) != 0)
  2327.    internal_f.f_symptr = sym_base;
  2328.   else
  2329.    internal_f.f_symptr = 0;
  2330.  
  2331.   internal_f.f_flags = 0;
  2332.  
  2333.   if (abfd->flags & EXEC_P)
  2334.    internal_f.f_opthdr = AOUTSZ;
  2335.   else
  2336.    internal_f.f_opthdr = 0;
  2337.  
  2338.   if (!hasrelocs)
  2339.    internal_f.f_flags |= F_RELFLG;
  2340.   if (!haslinno)
  2341.    internal_f.f_flags |= F_LNNO;
  2342.   if (0 == bfd_get_symcount(abfd))
  2343.    internal_f.f_flags |= F_LSYMS;
  2344.   if (abfd->flags & EXEC_P)
  2345.    internal_f.f_flags |= F_EXEC;
  2346.  
  2347.   if (!abfd->xvec->byteorder_big_p)
  2348.    internal_f.f_flags |= F_AR32WR;
  2349.   else 
  2350.   internal_f.f_flags |= F_AR32W;
  2351.  
  2352.   /*
  2353.     FIXME, should do something about the other byte orders and
  2354.     architectures.
  2355.     */
  2356.  
  2357.   /* Set up architecture-dependent stuff */
  2358.  
  2359. { unsigned int   magic = 0;
  2360.   unsigned short    flags = 0;
  2361.   coff_set_flags(abfd, &magic, &flags);
  2362.   internal_f.f_magic = magic;
  2363.   internal_f.f_flags |= flags;
  2364.   /* ...and the "opt"hdr... */
  2365.  
  2366. #ifdef A29K
  2367. # ifdef ULTRA3            /* NYU's machine */
  2368.   /* FIXME: This is a bogus check.  I really want to see if there
  2369.    * is a .shbss or a .shdata section, if so then set the magic
  2370.    * number to indicate a shared data executable.
  2371.    */
  2372.   if (internal_f.f_nscns >= 7)
  2373.    internal_a.magic = SHMAGIC;     /* Shared magic */
  2374.   else
  2375. # endif                /* ULTRA3 */
  2376.    internal_a.magic = NMAGIC;     /* Assume separate i/d */
  2377. #define __A_MAGIC_SET__
  2378. #endif                /* A29K */
  2379. #ifdef I960
  2380.   internal_a.magic = (magic == I960ROMAGIC ? NMAGIC : OMAGIC);
  2381. #define __A_MAGIC_SET__
  2382. #endif                /* I960 */
  2383. #if M88
  2384. #define __A_MAGIC_SET__
  2385.   internal_a.magic = PAGEMAGICBCS;
  2386. #endif                /* M88 */
  2387.  
  2388. #if M68 || I386 || MIPS
  2389. #define __A_MAGIC_SET__
  2390.   /* Never was anything here for the 68k */
  2391. #endif                /* M88 */
  2392.  
  2393. #if RS6000COFF_C
  2394. #define __A_MAGIC_SET__
  2395.   internal_a.magic = (abfd->flags & D_PAGED)? RS6K_AOUTHDR_ZMAGIC:
  2396.   (abfd->flags & WP_TEXT)? RS6K_AOUTHDR_NMAGIC:
  2397.   RS6K_AOUTHDR_OMAGIC;
  2398. #endif
  2399.  
  2400. #ifndef __A_MAGIC_SET__
  2401. # include "Your aouthdr magic number is not being set!"
  2402. #else
  2403. # undef __A_MAGIC_SET__
  2404. #endif
  2405. }
  2406.   /* Now should write relocs, strings, syms */
  2407.   obj_sym_filepos(abfd) = sym_base;
  2408.  
  2409. #ifndef NO_COFF_SYMBOLS
  2410.   if (bfd_get_symcount(abfd) != 0) {
  2411.       coff_renumber_symbols(abfd);
  2412.       coff_mangle_symbols(abfd);
  2413.       coff_write_symbols(abfd);
  2414.       coff_write_linenumbers(abfd);
  2415.       coff_write_relocs(abfd);
  2416.     }
  2417. #endif                /* NO_COFF_SYMBOLS */
  2418.   if (text_sec) {
  2419.       internal_a.tsize = bfd_get_section_size_before_reloc(text_sec);
  2420.       internal_a.text_start = internal_a.tsize ? text_sec->vma : 0;
  2421.     }
  2422.   if (data_sec) {
  2423.       internal_a.dsize = bfd_get_section_size_before_reloc(data_sec);
  2424.       internal_a.data_start = internal_a.dsize ? data_sec->vma      : 0;
  2425.     }
  2426.   if (bss_sec) {
  2427.       internal_a.bsize = bfd_get_section_size_before_reloc(bss_sec);
  2428.     }
  2429.  
  2430.   internal_a.entry = bfd_get_start_address(abfd);
  2431.   internal_f.f_nsyms =  bfd_get_symcount(abfd);
  2432.  
  2433.   /* now write them */
  2434.   if (bfd_seek(abfd, 0L, SEEK_SET) != 0)
  2435.    return false;
  2436. {
  2437.   FILHDR buff;
  2438.   coff_swap_filehdr_out(abfd, &internal_f, &buff);
  2439.   bfd_write((PTR) &buff, 1, FILHSZ, abfd);
  2440. }
  2441.   if (abfd->flags & EXEC_P) {
  2442.       AOUTHDR buff;
  2443.       coff_swap_aouthdr_out(abfd, &internal_a, &buff);
  2444.       bfd_write((PTR) &buff, 1, AOUTSZ, abfd);
  2445.     }
  2446.   return true;
  2447. }
  2448.  
  2449. #ifndef NO_COFF_SYMBOLS
  2450.  
  2451. /*
  2452. this function transforms the offsets into the symbol table into
  2453. pointers to syments.
  2454. */
  2455.  
  2456.  
  2457. static void
  2458. DEFUN(coff_pointerize_aux,(ignore_abfd, table_base, type, class, auxent),
  2459. bfd *ignore_abfd AND
  2460. combined_entry_type *table_base AND
  2461. int type AND
  2462. int class AND
  2463. combined_entry_type *auxent)
  2464. {
  2465.   /* Don't bother if this is a file or a section */
  2466.   if (class == C_STAT && type == T_NULL) return;
  2467.   if (class == C_FILE) return;
  2468.  
  2469.   /* Otherwise patch up */
  2470.   if (ISFCN(type) || ISTAG(class) || class == C_BLOCK) {
  2471.       auxent->u.auxent.x_sym.x_fcnary.x_fcn.x_endndx.p = table_base +
  2472.        auxent->u.auxent.x_sym.x_fcnary.x_fcn.x_endndx.l;
  2473.       auxent->fix_end = 1;
  2474.     }
  2475.   if (auxent->u.auxent.x_sym.x_tagndx.l != 0) {
  2476.       auxent->u.auxent.x_sym.x_tagndx.p =
  2477.        table_base +  auxent->u.auxent.x_sym.x_tagndx.l;
  2478.       auxent->fix_tag = 1;
  2479.     }
  2480. }
  2481.  
  2482. #endif /* NO_COFF_SYMBOLS */
  2483.  
  2484. static          boolean
  2485. DEFUN(coff_set_section_contents,(abfd, section, location, offset, count),
  2486.       bfd            *abfd AND
  2487.       sec_ptr         section AND
  2488.       PTR             location AND
  2489.       file_ptr        offset AND
  2490.       bfd_size_type   count)
  2491. {
  2492.     if (abfd->output_has_begun == false)    /* set by bfd.c handler */
  2493.     coff_compute_section_file_positions(abfd);
  2494.  
  2495.     bfd_seek(abfd, (file_ptr) (section->filepos + offset), SEEK_SET);
  2496.  
  2497.     if (count != 0) {
  2498.     return (bfd_write(location, 1, count, abfd) == count) ? true : false;
  2499.     }
  2500.     return true;
  2501. }
  2502. #if 0
  2503. static          boolean
  2504. coff_close_and_cleanup(abfd)
  2505.     bfd            *abfd;
  2506. {
  2507.   if (!bfd_read_p(abfd))
  2508.     switch (abfd->format) {
  2509.     case bfd_archive:
  2510.       if (!_bfd_write_archive_contents(abfd))
  2511.     return false;
  2512.       break;
  2513.     case bfd_object:
  2514.       if (!coff_write_object_contents(abfd))
  2515.     return false;
  2516.       break;
  2517.     default:
  2518.       bfd_error = invalid_operation;
  2519.       return false;
  2520.     }
  2521.  
  2522.   /* We depend on bfd_close to free all the memory on the obstack.  */
  2523.   /* FIXME if bfd_release is not using obstacks! */
  2524.   return true;
  2525. }
  2526.  
  2527. #endif
  2528. static PTR
  2529. buy_and_read(abfd, where, seek_direction, size)
  2530.     bfd            *abfd;
  2531.     file_ptr        where;
  2532.     int             seek_direction;
  2533.     size_t          size;
  2534. {
  2535.     PTR             area = (PTR) bfd_alloc(abfd, size);
  2536.     if (!area) {
  2537.     bfd_error = no_memory;
  2538.     return (NULL);
  2539.     }
  2540.     bfd_seek(abfd, where, seek_direction);
  2541.     if (bfd_read(area, 1, size, abfd) != size) {
  2542.     bfd_error = system_call_error;
  2543.     return (NULL);
  2544.     }                /* on error */
  2545.     return (area);
  2546. }                /* buy_and_read() */
  2547.  
  2548.  
  2549. #ifndef NO_COFF_SYMBOLS
  2550.  
  2551. static char *
  2552. DEFUN(build_string_table,(abfd),
  2553. bfd *abfd)
  2554. {
  2555.   char string_table_size_buffer[4];
  2556.   unsigned int string_table_size;
  2557.   char *string_table;
  2558.  
  2559.   /* At this point we should be "seek"'d to the end of the
  2560.      symbols === the symbol table size.  */
  2561.   if (bfd_read((char *) string_table_size_buffer,
  2562.            sizeof(string_table_size_buffer),
  2563.            1, abfd) != sizeof(string_table_size)) {
  2564.     bfd_error = system_call_error;
  2565.     return (NULL);
  2566.   }                /* on error */
  2567.  
  2568.   string_table_size = bfd_h_get_32(abfd, (bfd_byte *) string_table_size_buffer);
  2569.  
  2570.   if ((string_table = (PTR) bfd_alloc(abfd, string_table_size -= 4)) == NULL) {
  2571.     bfd_error = no_memory;
  2572.     return (NULL);
  2573.   }                /* on mallocation error */
  2574.   if (bfd_read(string_table, string_table_size, 1, abfd) != string_table_size) {
  2575.     bfd_error = system_call_error;
  2576.     return (NULL);
  2577.   }
  2578.   return string_table;
  2579. }
  2580.  
  2581. /* Allocate space for the ".debug" section, and read it.
  2582.    We did not read the debug section until now, because
  2583.    we didn't want to go to the trouble until someone needed it. */
  2584.  
  2585. static char *
  2586. DEFUN(build_debug_section,(abfd),
  2587.     bfd *abfd)
  2588. {
  2589.   char *debug_section;
  2590.   long position;
  2591.  
  2592.   asection *sect = bfd_get_section_by_name (abfd, ".debug");
  2593.  
  2594.   if (!sect) {
  2595.      bfd_error = no_debug_section;
  2596.      return NULL;
  2597.   }
  2598.  
  2599.   debug_section = (PTR) bfd_alloc (abfd,
  2600.                    bfd_get_section_size_before_reloc (sect));
  2601.   if (debug_section == NULL) {
  2602.     bfd_error = no_memory;
  2603.     return NULL;
  2604.   }
  2605.  
  2606.   /* Seek to the beginning of the `.debug' section and read it. 
  2607.      Save the current position first; it is needed by our caller.
  2608.      Then read debug section and reset the file pointer.  */
  2609.  
  2610.   position = bfd_tell (abfd);
  2611.   bfd_seek (abfd, sect->filepos, SEEK_SET);
  2612.   if (bfd_read (debug_section, 
  2613.         bfd_get_section_size_before_reloc (sect), 1, abfd)
  2614.       != bfd_get_section_size_before_reloc(sect)) {
  2615.     bfd_error = system_call_error;
  2616.     return NULL;
  2617.   }
  2618.   bfd_seek (abfd, position, SEEK_SET);
  2619.   return debug_section;
  2620. }
  2621.  
  2622.  
  2623. /* Return a pointer to a malloc'd copy of 'name'.  'name' may not be
  2624.  \0-terminated, but will not exceed 'maxlen' characters.  The copy *will*
  2625.  be \0-terminated.  */
  2626. static char *
  2627. DEFUN(copy_name,(abfd, name, maxlen),
  2628.       bfd *abfd AND
  2629.       char *name AND
  2630.       int maxlen)
  2631. {
  2632.   int  len;
  2633.   char *newname;
  2634.  
  2635.   for (len = 0; len < maxlen; ++len) {
  2636.     if (name[len] == '\0') {
  2637.       break;
  2638.     }
  2639.   }
  2640.  
  2641.   if ((newname = (PTR) bfd_alloc(abfd, len+1)) == NULL) {
  2642.     bfd_error = no_memory;
  2643.     return (NULL);
  2644.   }
  2645.   strncpy(newname, name, len);
  2646.   newname[len] = '\0';
  2647.   return newname;
  2648. }
  2649.  
  2650.  
  2651. /* Read a symbol table into freshly bfd_allocated memory, swap it, and
  2652.    knit the symbol names into a normalized form.  By normalized here I
  2653.    mean that all symbols have an n_offset pointer that points to a null-
  2654.    terminated string.  */
  2655.  
  2656. #ifndef SYMNAME_IN_DEBUG
  2657. #define    SYMNAME_IN_DEBUG(x)  0
  2658. #endif
  2659.  
  2660. static combined_entry_type *
  2661. DEFUN(get_normalized_symtab,(abfd),
  2662. bfd            *abfd)
  2663. {
  2664.   combined_entry_type          *internal;
  2665.   combined_entry_type          *internal_ptr;
  2666.   combined_entry_type          *symbol_ptr;
  2667.   combined_entry_type         *internal_end;
  2668.   SYMENT *raw;
  2669.   SYMENT *raw_src;
  2670.   SYMENT *raw_end;
  2671.   char           *string_table = NULL;
  2672.   char         *debug_section = NULL;
  2673.   unsigned long   size;
  2674.  
  2675.   unsigned int raw_size;
  2676.   if (obj_raw_syments(abfd) != (combined_entry_type *)NULL) {
  2677.       return obj_raw_syments(abfd);
  2678.     }
  2679.   if ((size = bfd_get_symcount(abfd) * sizeof(combined_entry_type)) == 0) {
  2680.       bfd_error = no_symbols;
  2681.       return (NULL);
  2682.     }
  2683.  
  2684.   internal = (combined_entry_type *)bfd_alloc(abfd, size);
  2685.   internal_end = internal + bfd_get_symcount(abfd);
  2686.  
  2687.   raw_size =      bfd_get_symcount(abfd) * SYMESZ;
  2688.   raw = (SYMENT *)bfd_alloc(abfd,raw_size);
  2689.  
  2690.   if (bfd_seek(abfd, obj_sym_filepos(abfd), SEEK_SET) == -1
  2691.       || bfd_read((PTR)raw, raw_size, 1, abfd) != raw_size) {
  2692.       bfd_error = system_call_error;
  2693.       return (NULL);
  2694.     }
  2695.   /* mark the end of the symbols */
  2696.   raw_end = raw + bfd_get_symcount(abfd);
  2697.   /*
  2698.     FIXME SOMEDAY.  A string table size of zero is very weird, but
  2699.     probably possible.  If one shows up, it will probably kill us.
  2700.     */
  2701.  
  2702.   /* Swap all the raw entries */
  2703.   for (raw_src = raw, internal_ptr = internal;
  2704.        raw_src < raw_end;
  2705.        raw_src++, internal_ptr++) {
  2706.  
  2707.       unsigned int i;
  2708.       coff_swap_sym_in(abfd, (char *)raw_src, (char *)&internal_ptr->u.syment);
  2709.       internal_ptr->fix_tag = 0;
  2710.       internal_ptr->fix_end = 0;
  2711.       symbol_ptr = internal_ptr;
  2712.     
  2713.       for (i = 0;
  2714.        i < symbol_ptr->u.syment.n_numaux;
  2715.        i++) 
  2716.       {
  2717.     internal_ptr++;
  2718.     raw_src++;
  2719.       
  2720.     internal_ptr->fix_tag = 0;
  2721.     internal_ptr->fix_end = 0;
  2722.     coff_swap_aux_in(abfd, (char *)(raw_src),
  2723.              symbol_ptr->u.syment.n_type,
  2724.              symbol_ptr->u.syment.n_sclass,
  2725.              &(internal_ptr->u.auxent));
  2726.     /* Remember that bal entries arn't pointerized */
  2727.     if (i != 1 || symbol_ptr->u.syment.n_sclass != C_LEAFPROC)
  2728.     {
  2729.       
  2730.     coff_pointerize_aux(abfd,
  2731.                 internal,
  2732.                 symbol_ptr->u.syment.n_type,
  2733.                 symbol_ptr->u.syment.n_sclass,
  2734.                 internal_ptr);
  2735.       }
  2736.     
  2737.       }
  2738.     }
  2739.  
  2740.   /* Free all the raw stuff */
  2741.   bfd_release(abfd, raw);
  2742.  
  2743.   for (internal_ptr = internal; internal_ptr < internal_end;
  2744.        internal_ptr ++)
  2745.   {
  2746.     if (internal_ptr->u.syment.n_sclass == C_FILE) {
  2747.     /* make a file symbol point to the name in the auxent, since
  2748.        the text ".file" is redundant */
  2749.     if ((internal_ptr+1)->u.auxent.x_file.x_n.x_zeroes == 0) {
  2750.         /* the filename is a long one, point into the string table */
  2751.         if (string_table == NULL) {
  2752.         string_table = build_string_table(abfd);
  2753.           }
  2754.  
  2755.         internal_ptr->u.syment._n._n_n._n_offset =
  2756.          (int) (string_table - 4 +
  2757.             (internal_ptr+1)->u.auxent.x_file.x_n.x_offset);
  2758.       }
  2759.     else {
  2760.         /* ordinary short filename, put into memory anyway */
  2761.         internal_ptr->u.syment._n._n_n._n_offset = (int)
  2762.          copy_name(abfd, (internal_ptr+1)->u.auxent.x_file.x_fname,
  2763.                FILNMLEN);
  2764.       }
  2765.       }
  2766.     else {
  2767.     if (internal_ptr->u.syment._n._n_n._n_zeroes != 0) {
  2768.         /* This is a "short" name.  Make it long.  */
  2769.         unsigned long   i = 0;
  2770.         char           *newstring = NULL;
  2771.  
  2772.         /* find the length of this string without walking into memory
  2773.            that isn't ours.  */
  2774.         for (i = 0; i < 8; ++i) {
  2775.         if (internal_ptr->u.syment._n._n_name[i] == '\0') {
  2776.             break;
  2777.           }        /* if end of string */
  2778.           }            /* possible lengths of this string. */
  2779.  
  2780.         if ((newstring = (PTR) bfd_alloc(abfd, ++i)) == NULL) {
  2781.         bfd_error = no_memory;
  2782.         return (NULL);
  2783.           }            /* on error */
  2784.         bzero(newstring, i);
  2785.         strncpy(newstring, internal_ptr->u.syment._n._n_name, i-1);
  2786.         internal_ptr->u.syment._n._n_n._n_offset =  (int) newstring;
  2787.         internal_ptr->u.syment._n._n_n._n_zeroes = 0;
  2788.       }
  2789.     else if (!SYMNAME_IN_DEBUG(&internal_ptr->u.syment)) {
  2790.         /* Long name already.  Point symbol at the string in the table.  */
  2791.         if (string_table == NULL) {
  2792.         string_table = build_string_table(abfd);
  2793.           }
  2794.         internal_ptr->u.syment._n._n_n._n_offset = (int)
  2795.          (string_table - 4 + internal_ptr->u.syment._n._n_n._n_offset);
  2796.       }
  2797.     else {
  2798.         /* Long name in debug section.  Very similar.  */
  2799.         if (debug_section == NULL) {
  2800.         debug_section = build_debug_section(abfd);
  2801.           }
  2802.         internal_ptr->u.syment._n._n_n._n_offset = (int)
  2803.          (debug_section + internal_ptr->u.syment._n._n_n._n_offset);
  2804.       }
  2805.       }
  2806.     internal_ptr += internal_ptr->u.syment.n_numaux;
  2807.   }
  2808.  
  2809.   obj_raw_syments(abfd) = internal;
  2810.  
  2811.   return (internal);
  2812. }                /* get_normalized_symtab() */
  2813.  
  2814. #endif /* NO_COFF_SYMBOLS */
  2815.  
  2816. static
  2817. struct sec *
  2818. DEFUN(section_from_bfd_index,(abfd, index),
  2819.       bfd            *abfd AND
  2820.       int             index)
  2821. {
  2822.   struct sec *answer = abfd->sections;
  2823.  
  2824.   if (index == N_ABS) 
  2825.   {
  2826.     return &bfd_abs_section;
  2827.   }
  2828.   if (index == N_UNDEF)
  2829.   {
  2830.     return &bfd_und_section;
  2831.   }
  2832.   if(index == N_DEBUG)
  2833.   {
  2834.     return &bfd_debug_section;
  2835.     
  2836.   }
  2837.   
  2838.   while (answer) {
  2839.       if (answer->target_index == index)
  2840.        return answer;
  2841.       answer = answer->next;
  2842.     }
  2843.   BFD_ASSERT(0);
  2844.   return &bfd_und_section;    /* For gcc -W and lint.  Never executed. */
  2845. }
  2846.  
  2847. #ifndef NO_COFF_LINENOS
  2848.  
  2849. /*
  2850. SUBSUBSECTION 
  2851.     Reading Linenumbers
  2852.  
  2853.     Creating the linenumber table is done by reading in the entire
  2854.     coff linenumber table, and creating another table for internal use.
  2855.  
  2856.     A coff line number table is structured so that each function
  2857.     is marked as having a line number of 0. Each line within the
  2858.     function is an offset from the first line in the function. The
  2859.     base of the line number information for the table is stored in
  2860.     the symbol associated with the function. 
  2861.  
  2862.     The information is copied from the external to the internal
  2863.     table, and each symbol which marks a function is marked by
  2864.     pointing its...
  2865.  
  2866.     How does this work ?
  2867.  
  2868. */
  2869.  
  2870. static boolean
  2871. coff_slurp_line_table(abfd, asect)
  2872. bfd            *abfd;
  2873. asection       *asect;
  2874.   {
  2875.     LINENO  *native_lineno;
  2876.     alent          *lineno_cache;
  2877.  
  2878.     BFD_ASSERT(asect->lineno == (alent *) NULL);
  2879.  
  2880.     native_lineno = (LINENO *) buy_and_read(abfd,
  2881.                         asect->line_filepos,
  2882.                         SEEK_SET,
  2883.                         (size_t) (LINESZ *
  2884.                               asect->lineno_count));
  2885.     lineno_cache =
  2886.       (alent *) bfd_alloc(abfd, (size_t) ((asect->lineno_count + 1) * sizeof(alent)));
  2887.     if (lineno_cache == NULL) {
  2888.       bfd_error = no_memory;
  2889.       return false;
  2890.     } else {
  2891.       unsigned int    counter = 0;
  2892.       alent          *cache_ptr = lineno_cache;
  2893.       LINENO  *src = native_lineno;
  2894.  
  2895.       while (counter < asect->lineno_count) {
  2896.     struct internal_lineno dst;
  2897.     coff_swap_lineno_in(abfd, src, &dst);
  2898.     cache_ptr->line_number = dst.l_lnno;
  2899.  
  2900.     if (cache_ptr->line_number == 0) {
  2901.       coff_symbol_type *sym =
  2902.         (coff_symbol_type *) (dst.l_addr.l_symndx
  2903.                   + obj_raw_syments(abfd))->u.syment._n._n_n._n_zeroes;
  2904.       cache_ptr->u.sym = (asymbol *) sym;
  2905.       sym->lineno = cache_ptr;
  2906.     }
  2907.     else {
  2908.       cache_ptr->u.offset = dst.l_addr.l_paddr
  2909.         - bfd_section_vma(abfd, asect);
  2910.     }                /* If no linenumber expect a symbol index */
  2911.  
  2912.     cache_ptr++;
  2913.     src++;
  2914.     counter++;
  2915.       }
  2916.       cache_ptr->line_number = 0;
  2917.  
  2918.     }
  2919.     asect->lineno = lineno_cache;
  2920.     /* FIXME, free native_lineno here, or use alloca or something. */
  2921.     return true;
  2922.   }                /* coff_slurp_line_table() */
  2923.  
  2924. #endif /* NO_COFF_LINENOS */
  2925.  
  2926. #ifndef NO_COFF_LINENOS
  2927.  
  2928. static          boolean
  2929. DEFUN(coff_slurp_symbol_table,(abfd),
  2930.       bfd            *abfd)
  2931. {
  2932.   combined_entry_type         *native_symbols;
  2933.   coff_symbol_type *cached_area;
  2934.   unsigned int   *table_ptr;
  2935.  
  2936.   unsigned int    number_of_symbols = 0;
  2937.   if (obj_symbols(abfd))
  2938.     return true;
  2939.   bfd_seek(abfd, obj_sym_filepos(abfd), SEEK_SET);
  2940.  
  2941.   /* Read in the symbol table */
  2942.   if ((native_symbols = get_normalized_symtab(abfd)) == NULL) {
  2943.     return (false);
  2944.   }                /* on error */
  2945.  
  2946.   /* Allocate enough room for all the symbols in cached form */
  2947.   cached_area =
  2948.     (coff_symbol_type *)
  2949.       bfd_alloc(abfd, (size_t) (bfd_get_symcount(abfd) * sizeof(coff_symbol_type)));
  2950.  
  2951.   if (cached_area == NULL) {
  2952.     bfd_error = no_memory;
  2953.     return false;
  2954.   }                /* on error */
  2955.   table_ptr =
  2956.     (unsigned int *)
  2957.       bfd_alloc(abfd, (size_t) (bfd_get_symcount(abfd) * sizeof(unsigned int)));
  2958.  
  2959.   if (table_ptr == NULL) {
  2960.     bfd_error = no_memory;
  2961.     return false;
  2962.   } 
  2963.   else 
  2964.   {
  2965.     coff_symbol_type *dst = cached_area;
  2966.     unsigned int    last_native_index = bfd_get_symcount(abfd);
  2967.     unsigned int    this_index = 0;
  2968.     while (this_index < last_native_index) {
  2969.       combined_entry_type         *src = native_symbols + this_index;
  2970.       table_ptr[this_index] = number_of_symbols;
  2971.       dst->symbol.the_bfd = abfd;
  2972.  
  2973.       dst->symbol.name = (char *)(src->u.syment._n._n_n._n_offset);
  2974.       /*
  2975.     We use the native name field to point to the cached field
  2976.     */
  2977.       src->u.syment._n._n_n._n_zeroes = (int) dst;
  2978.       dst->symbol.section = section_from_bfd_index(abfd,
  2979.                            src->u.syment.n_scnum);
  2980.       dst->symbol.flags = 0;
  2981.       dst->done_lineno = false;
  2982.       
  2983.       switch (src->u.syment.n_sclass) {
  2984. #ifdef I960
  2985.       case C_LEAFEXT:
  2986. #if 0
  2987.     dst->symbol.value = src->u.syment.n_value - dst->symbol.section->vma;
  2988.     dst->symbol.flags = BSF_EXPORT | BSF_GLOBAL;
  2989.     dst->symbol.flags |= BSF_NOT_AT_END;
  2990. #endif
  2991.     /* Fall through to next case */
  2992.  
  2993. #endif
  2994.  
  2995.       case C_EXT:
  2996. #ifdef RS6000COFF_C
  2997.       case C_HIDEXT:
  2998. #endif
  2999.     if ((src->u.syment.n_scnum) == 0) {
  3000.       if ((src->u.syment.n_value) == 0) {
  3001.         dst->symbol.section = &bfd_und_section;
  3002.         dst->symbol.value= 0;
  3003.       }
  3004.       else {
  3005.         dst->symbol.section = &bfd_com_section;
  3006.         dst->symbol.value = (src->u.syment.n_value);
  3007.       }
  3008.     }
  3009.     else {
  3010.       /*
  3011.         Base the value as an index from the base of the
  3012.         section
  3013.         */
  3014.  
  3015.         dst->symbol.flags = BSF_EXPORT | BSF_GLOBAL;
  3016.         dst->symbol.value = src->u.syment.n_value - dst->symbol.section->vma;
  3017.  
  3018.       if (ISFCN((src->u.syment.n_type))) {
  3019.         /*
  3020.           A function ext does not go at the end of a file
  3021.           */
  3022.         dst->symbol.flags |= BSF_NOT_AT_END;
  3023.       }
  3024.     }
  3025.  
  3026.  
  3027.     break;
  3028.  
  3029.       case C_STAT:        /* static             */
  3030. #ifdef I960
  3031.       case C_LEAFSTAT:        /* static leaf procedure        */
  3032. #endif
  3033.       case C_LABEL:        /* label             */
  3034.     if (src->u.syment.n_scnum == -2)
  3035.       dst->symbol.flags = BSF_DEBUGGING;
  3036.     else
  3037.       dst->symbol.flags = BSF_LOCAL;
  3038.     /*
  3039.       Base the value as an index from the base of the section, if
  3040.       there is one
  3041.       */
  3042.     if (dst->symbol.section)
  3043.       dst->symbol.value = (src->u.syment.n_value) -
  3044.         dst->symbol.section->vma;
  3045.     else
  3046.       dst->symbol.value = (src->u.syment.n_value) ;
  3047.     break;
  3048.  
  3049.       case C_MOS:        /* member of structure     */
  3050.       case C_EOS:        /* end of structure         */
  3051. #ifdef NOTDEF    /* C_AUTOARG has the same value */
  3052. #ifdef C_GLBLREG
  3053.       case C_GLBLREG:        /* A29k-specific storage class */
  3054. #endif
  3055. #endif
  3056.       case C_REGPARM:        /* register parameter         */
  3057.       case C_REG:        /* register variable         */
  3058. #ifdef C_AUTOARG
  3059.       case C_AUTOARG:        /* 960-specific storage class */
  3060. #endif
  3061.       case C_TPDEF:        /* type definition         */
  3062.       case C_ARG:
  3063.       case C_AUTO:        /* automatic variable */
  3064.       case C_FIELD:        /* bit field */
  3065.       case C_ENTAG:        /* enumeration tag         */
  3066.       case C_MOE:        /* member of enumeration     */
  3067.       case C_MOU:        /* member of union         */
  3068.       case C_UNTAG:        /* union tag             */
  3069.     dst->symbol.flags = BSF_DEBUGGING;
  3070.     dst->symbol.value = (src->u.syment.n_value);
  3071.     break;
  3072.  
  3073.       case C_FILE:        /* file name             */
  3074.       case C_STRTAG:        /* structure tag         */
  3075. #ifdef RS6000COFF_C
  3076.       case C_BINCL:        /* beginning of include file     */
  3077.       case C_EINCL:        /* ending of include file        */
  3078.       case C_GSYM:
  3079.       case C_LSYM:
  3080.       case C_PSYM:
  3081.       case C_RSYM:
  3082.       case C_RPSYM:
  3083.       case C_STSYM:
  3084.       case C_DECL:
  3085.       case C_ENTRY:
  3086.       case C_FUN:
  3087.       case C_BSTAT:
  3088.       case C_ESTAT:
  3089. #endif
  3090.     dst->symbol.flags = BSF_DEBUGGING;
  3091.     dst->symbol.value = (src->u.syment.n_value);
  3092.     break;
  3093.  
  3094.       case C_BLOCK:        /* ".bb" or ".eb"         */
  3095.       case C_FCN:        /* ".bf" or ".ef"         */
  3096.       case C_EFCN:        /* physical end of function     */
  3097.     dst->symbol.flags = BSF_LOCAL;
  3098.     /*
  3099.       Base the value as an index from the base of the section
  3100.       */
  3101.     dst->symbol.value = (src->u.syment.n_value) - dst->symbol.section->vma;
  3102.     break;
  3103.  
  3104.       case C_NULL:
  3105.       case C_EXTDEF:        /* external definition         */
  3106.       case C_ULABEL:        /* undefined label         */
  3107.       case C_USTATIC:        /* undefined static         */
  3108.       case C_LINE:        /* line # reformatted as symbol table entry */
  3109.       case C_ALIAS:        /* duplicate tag         */
  3110.       case C_HIDDEN:        /* ext symbol in dmert public lib */
  3111.       default:
  3112.  
  3113.     fprintf(stderr,"Unrecognized storage class %d\n",
  3114.                 src->u.syment.n_sclass);
  3115.     abort();
  3116.     dst->symbol.flags = BSF_DEBUGGING;
  3117.     dst->symbol.value = (src->u.syment.n_value);
  3118.     break;
  3119.       }
  3120.  
  3121. /*      BFD_ASSERT(dst->symbol.flags != 0);*/
  3122.  
  3123.       dst->native = src;
  3124.  
  3125.       dst->symbol.udata = 0;
  3126.       dst->lineno = (alent *) NULL;
  3127.       this_index += (src->u.syment.n_numaux) + 1;
  3128.       dst++;
  3129.       number_of_symbols++;
  3130.     }                /* walk the native symtab */
  3131.   }                /* bfdize the native symtab */
  3132.  
  3133.   obj_symbols(abfd) = cached_area;
  3134.   obj_raw_syments(abfd) = native_symbols;
  3135.  
  3136.   bfd_get_symcount(abfd) = number_of_symbols;
  3137.   obj_convert(abfd) = table_ptr;
  3138.   /* Slurp the line tables for each section too */
  3139.     {
  3140.       asection       *p;
  3141.       p = abfd->sections;
  3142.       while (p) {
  3143.     coff_slurp_line_table(abfd, p);
  3144.     p = p->next;
  3145.       }
  3146.     }
  3147.   return true;
  3148. }                /* coff_slurp_symbol_table() */
  3149.  
  3150. static unsigned int
  3151. coff_get_symtab_upper_bound(abfd)
  3152. bfd            *abfd;
  3153.   {
  3154.     if (!coff_slurp_symbol_table(abfd))
  3155.       return 0;
  3156.  
  3157.     return (bfd_get_symcount(abfd) + 1) * (sizeof(coff_symbol_type *));
  3158.   }
  3159.  
  3160.  
  3161. static unsigned int
  3162. DEFUN(coff_get_symtab, (abfd, alocation),
  3163.       bfd            *abfd AND
  3164.       asymbol       **alocation)
  3165. {
  3166.     unsigned int    counter = 0;
  3167.     coff_symbol_type *symbase;
  3168.     coff_symbol_type **location = (coff_symbol_type **) (alocation);
  3169.     if (!coff_slurp_symbol_table(abfd))
  3170.      return 0;
  3171.  
  3172.     symbase = obj_symbols(abfd);
  3173.     while (counter <  bfd_get_symcount(abfd))
  3174.     {
  3175.     /* This nasty code looks at the symbol to decide whether or
  3176.        not it is descibes a constructor/destructor entry point. It
  3177.        is structured this way to (hopefully) speed non matches */
  3178. #if 0    
  3179.     if (0 && symbase->symbol.name[9] == '$') 
  3180.     {
  3181.         bfd_constructor_entry(abfd, 
  3182.                  (asymbol **)location,
  3183.                   symbase->symbol.name[10] == 'I' ?
  3184.                   "CTOR" : "DTOR");
  3185.     }
  3186. #endif
  3187.     *(location++) = symbase++;
  3188.     counter++;
  3189.     }
  3190.     *location++ = 0;
  3191.     return bfd_get_symcount(abfd);
  3192. }
  3193.  
  3194. #endif /* NO_COFF_SYMBOLS */
  3195.  
  3196. static unsigned int
  3197. coff_get_reloc_upper_bound(abfd, asect)
  3198. bfd            *abfd;
  3199. sec_ptr         asect;
  3200.   {
  3201.     if (bfd_get_format(abfd) != bfd_object) {
  3202.       bfd_error = invalid_operation;
  3203.       return 0;
  3204.     }
  3205.     return (asect->reloc_count + 1) * sizeof(arelent *);
  3206.   }
  3207.  
  3208. /*
  3209. SUBSUBSECTION 
  3210.     Reading Relocations
  3211.  
  3212.     Coff relocations are easily transformed into the internal BFD form
  3213.     (@code{arelent}).
  3214.  
  3215.     Reading a coff relocation table is done in the following stages:
  3216.  
  3217.     o The entire coff relocation table is read into memory.
  3218.  
  3219.     o Each relocation is processed in turn, first it is swapped from the
  3220.     external to the internal form.
  3221.  
  3222.     o The symbol referenced in the relocation's symbol index is
  3223.     turned intoa pointer into the canonical symbol table. Note
  3224.     that this table is the same as the one returned by a call to
  3225.     @code{bfd_canonicalize_symtab}. The back end will call the
  3226.     routine and save the result if a canonicalization hasn't been done.
  3227.  
  3228.     o The reloc index is turned into a pointer to a howto
  3229.     structure, in a back end specific way. For instance, the 386
  3230.     and 960 use the @code{r_type} to directly produce an index
  3231.     into a howto table vector; the 88k subtracts a number from the
  3232.     @code{r_type} field and creates an addend field.
  3233.  
  3234.  
  3235. */
  3236.  
  3237. #ifndef CALC_ADDEND
  3238. #define CALC_ADDEND(abfd, ptr, reloc, cache_ptr)     \
  3239.         if (ptr && ptr->the_bfd == abfd        \
  3240.         && ptr->section != (asection *) NULL    \
  3241.         && ((ptr->flags & BSF_OLD_COMMON)== 0))    \
  3242.         {                        \
  3243.         cache_ptr->addend = -(ptr->section->vma + ptr->value);    \
  3244.         }                        \
  3245.         else {                    \
  3246.         cache_ptr->addend = 0;            \
  3247.         }            
  3248. #endif
  3249.  
  3250. static          boolean
  3251. DEFUN(coff_slurp_reloc_table,(abfd, asect, symbols),
  3252.       bfd            *abfd AND
  3253.       sec_ptr         asect AND
  3254.       asymbol       **symbols)
  3255. {
  3256.   RELOC   *native_relocs;
  3257.   arelent        *reloc_cache;
  3258.   arelent        *cache_ptr;
  3259.  
  3260.   unsigned int idx;
  3261.   
  3262.   if (asect->relocation)
  3263.    return true;
  3264.   if (asect->reloc_count == 0)
  3265.    return true;
  3266.   if (asect->flags & SEC_CONSTRUCTOR)
  3267.    return true;
  3268. #ifndef NO_COFF_SYMBOLS
  3269.   if (!coff_slurp_symbol_table(abfd))
  3270.    return false;
  3271. #endif
  3272.   native_relocs =
  3273.    (RELOC *) buy_and_read(abfd,
  3274.               asect->rel_filepos,
  3275.               SEEK_SET,
  3276.               (size_t) (RELSZ *
  3277.                     asect->reloc_count));
  3278.   reloc_cache = (arelent *)
  3279.    bfd_alloc(abfd, (size_t) (asect->reloc_count * sizeof(arelent)));
  3280.  
  3281.   if (reloc_cache == NULL) {
  3282.       bfd_error = no_memory;
  3283.       return false;
  3284.     } 
  3285.  
  3286.   
  3287.   for (idx = 0; idx < asect->reloc_count; idx ++) 
  3288.   {
  3289. #ifdef RELOC_PROCESSING
  3290.       struct internal_reloc dst;
  3291.       struct external_reloc  *src;
  3292.  
  3293.       cache_ptr = reloc_cache + idx;
  3294.       src = native_relocs + idx;
  3295.       bfd_swap_reloc_in(abfd, src, &dst);
  3296.  
  3297.       RELOC_PROCESSING(cache_ptr, &dst, symbols, abfd, asect);
  3298. #else
  3299.       struct internal_reloc dst;
  3300.       asymbol        *ptr;
  3301.       struct external_reloc  *src;
  3302.  
  3303.       cache_ptr = reloc_cache + idx;
  3304.       src = native_relocs + idx;
  3305.  
  3306.       bfd_swap_reloc_in(abfd, src, &dst);
  3307.  
  3308.  
  3309.       cache_ptr->address = dst.r_vaddr;
  3310.  
  3311.       if (dst.r_symndx != -1) 
  3312.       {
  3313.       cache_ptr->sym_ptr_ptr = symbols + obj_convert(abfd)[dst.r_symndx];
  3314.       ptr = *(cache_ptr->sym_ptr_ptr);
  3315.       }
  3316.       else 
  3317.       {
  3318.     cache_ptr->sym_ptr_ptr= bfd_abs_section.symbol_ptr_ptr;
  3319.         ptr = 0;
  3320.           
  3321.       }
  3322.  
  3323.       /*
  3324.     The symbols definitions that we have read in have been
  3325.     relocated as if their sections started at 0. But the offsets
  3326.     refering to the symbols in the raw data have not been
  3327.     modified, so we have to have a negative addend to compensate.
  3328.     
  3329.     Note that symbols which used to be common must be left alone */
  3330.  
  3331.       /* Calculate any reloc addend by looking at the symbol */
  3332.       CALC_ADDEND(abfd, ptr, dst, cache_ptr);
  3333.  
  3334.       cache_ptr->address -= asect->vma;
  3335. /* !!     cache_ptr->section = (asection *) NULL;*/
  3336.  
  3337.       /* Fill in the cache_ptr->howto field from dst.r_type */
  3338.       RTYPE2HOWTO(cache_ptr, &dst);
  3339. #endif
  3340.  
  3341.   }
  3342.  
  3343.   asect->relocation = reloc_cache;
  3344.   return true;
  3345. }
  3346.  
  3347.  
  3348. /* This is stupid.  This function should be a boolean predicate */
  3349. static unsigned int
  3350. DEFUN(coff_canonicalize_reloc, (abfd, section, relptr, symbols),
  3351. bfd            *abfd AND
  3352. sec_ptr         section AND
  3353. arelent       **relptr AND
  3354. asymbol       **symbols)
  3355. {
  3356.   arelent        *tblptr = section->relocation;
  3357.   unsigned int    count = 0;
  3358.  
  3359.  
  3360.   if (section->flags & SEC_CONSTRUCTOR) 
  3361.   {
  3362.     /* this section has relocs made up by us, they are not in the
  3363.        file, so take them out of their chain and place them into
  3364.        the data area provided */
  3365.     arelent_chain *chain = section->constructor_chain;
  3366.     for (count = 0; count < section->reloc_count; count ++) 
  3367.     {
  3368.       *relptr ++ = &chain->relent;
  3369.       chain = chain->next;
  3370.     }
  3371.  
  3372.   }
  3373.   else 
  3374.   { 
  3375.     coff_slurp_reloc_table(abfd, section, symbols);
  3376.  
  3377.  
  3378.     tblptr = section->relocation;
  3379.     if (!tblptr)
  3380.      return 0;
  3381.  
  3382.     for (; count++ < section->reloc_count;)
  3383.      *relptr++ = tblptr++;
  3384.  
  3385.  
  3386.   }
  3387.   *relptr = 0;
  3388.   return section->reloc_count;
  3389. }
  3390.  
  3391. #ifndef NO_COFF_SYMBOLS
  3392.  
  3393. /*
  3394. provided a BFD, a section and an offset into the section, calculate and
  3395. return the name of the source file and the line nearest to the wanted
  3396. location.
  3397. */
  3398.  
  3399. static          boolean
  3400. DEFUN(coff_find_nearest_line,(abfd,
  3401.                   section,
  3402.                   ignore_symbols,
  3403.                   offset,
  3404.                   filename_ptr,
  3405.                   functionname_ptr,
  3406.                   line_ptr),
  3407.       bfd            *abfd AND
  3408.       asection       *section AND
  3409.       asymbol       **ignore_symbols AND
  3410.       bfd_vma         offset AND
  3411.       CONST char      **filename_ptr AND
  3412.       CONST char       **functionname_ptr AND
  3413.       unsigned int   *line_ptr)
  3414. {
  3415.   static bfd     *cache_abfd;
  3416.   static asection *cache_section;
  3417.   static bfd_vma  cache_offset;
  3418.   static unsigned int cache_i;
  3419.   static alent   *cache_l;
  3420.  
  3421.   unsigned int    i = 0;
  3422.   coff_data_type *cof = coff_data(abfd);
  3423.   /* Run through the raw syments if available */
  3424.   combined_entry_type *p;
  3425.   alent          *l;
  3426.   unsigned int    line_base = 0;
  3427.  
  3428.  
  3429.   *filename_ptr = 0;
  3430.   *functionname_ptr = 0;
  3431.   *line_ptr = 0;
  3432.  
  3433.   /* Don't try and find line numbers in a non coff file */
  3434.   if (abfd->xvec->flavour != bfd_target_coff_flavour)
  3435.     return false;
  3436.  
  3437.   if (cof == NULL)
  3438.     return false;
  3439.  
  3440.   p = cof->raw_syments;
  3441.  
  3442.   for (i = 0; i < cof->raw_syment_count; i++) {
  3443.     if (p->u.syment.n_sclass == C_FILE) {
  3444.       /* File name has been moved into symbol */
  3445.       *filename_ptr = (char *) p->u.syment._n._n_n._n_offset;
  3446.       break;
  3447.     }
  3448.     p += 1 +  p->u.syment.n_numaux;
  3449.   }
  3450.   /* Now wander though the raw linenumbers of the section */
  3451.   /*
  3452.     If this is the same BFD as we were previously called with and this is
  3453.     the same section, and the offset we want is further down then we can
  3454.     prime the lookup loop
  3455.     */
  3456.   if (abfd == cache_abfd &&
  3457.       section == cache_section &&
  3458.       offset >= cache_offset) {
  3459.     i = cache_i;
  3460.     l = cache_l;
  3461.   }
  3462.   else {
  3463.     i = 0;
  3464.     l = section->lineno;
  3465.   }
  3466.  
  3467.   for (; i < section->lineno_count; i++) {
  3468.     if (l->line_number == 0) {
  3469.       /* Get the symbol this line number points at */
  3470.       coff_symbol_type *coff = (coff_symbol_type *) (l->u.sym);
  3471.       *functionname_ptr = coff->symbol.name;
  3472.       if (coff->native) {
  3473.     combined_entry_type  *s = coff->native;
  3474.     s = s + 1 + s->u.syment.n_numaux;
  3475.     /*
  3476.       S should now point to the .bf of the function
  3477.       */
  3478.     if (s->u.syment.n_numaux) {
  3479.       /*
  3480.         The linenumber is stored in the auxent
  3481.         */
  3482.       union internal_auxent   *a = &((s + 1)->u.auxent);
  3483.       line_base = a->x_sym.x_misc.x_lnsz.x_lnno;
  3484.     }
  3485.       }
  3486.     }
  3487.     else {
  3488.       if (l->u.offset > offset)
  3489.     break;
  3490.       *line_ptr = l->line_number + line_base + 1;
  3491.     }
  3492.     l++;
  3493.   }
  3494.  
  3495.   cache_abfd = abfd;
  3496.   cache_section = section;
  3497.   cache_offset = offset;
  3498.   cache_i = i;
  3499.   cache_l = l;
  3500.  
  3501.   return true;
  3502. }
  3503.  
  3504. #ifdef GNU960
  3505. file_ptr
  3506. coff_sym_filepos(abfd)
  3507. bfd *abfd;
  3508.   {
  3509.     return obj_sym_filepos(abfd);
  3510.   }
  3511. #endif
  3512.  
  3513. #endif /* NO_COFF_SYMBOLS */
  3514.  
  3515.  
  3516. static int
  3517. DEFUN(coff_sizeof_headers,(abfd, reloc),
  3518.       bfd *abfd AND
  3519.       boolean reloc)
  3520. {
  3521.     size_t size;
  3522.  
  3523.     if (reloc == false) {
  3524.     size = FILHSZ + AOUTSZ;
  3525.     }
  3526.     else {
  3527.     size = FILHSZ;
  3528.     }
  3529.  
  3530.     size +=  abfd->section_count * SCNHSZ;
  3531.     return size;
  3532. }
  3533.  
  3534. static bfd_vma 
  3535. DEFUN(get_value,(reloc, seclet),
  3536.       arelent  *reloc AND
  3537.       bfd_seclet_type *seclet)
  3538. {
  3539.   bfd_vma value;
  3540.   asymbol *symbol = *(reloc->sym_ptr_ptr);
  3541.   /* A symbol holds a pointer to a section, and an offset from the
  3542.      base of the section.  To relocate, we find where the section will
  3543.      live in the output and add that in */
  3544.  
  3545.   if (symbol->section == &bfd_und_section)
  3546.   {
  3547.     /* Ouch, this is an undefined symbol.. */
  3548.     bfd_error_vector.undefined_symbol(reloc, seclet);
  3549.     value = symbol->value;
  3550.   }
  3551.   else 
  3552.   {
  3553.     value = symbol->value +
  3554.      symbol->section->output_offset +
  3555.       symbol->section->output_section->vma;
  3556.   }
  3557.   
  3558.   
  3559.   /* Add the value contained in the relocation */
  3560.   value += (short)((reloc->addend) & 0xffff);
  3561.   
  3562.   return value;
  3563. }
  3564.  
  3565. static void
  3566. DEFUN(perform_slip,(s, slip, input_section, value),
  3567.       asymbol **s AND
  3568.       unsigned int slip AND
  3569.       asection *input_section AND
  3570.       bfd_vma value)
  3571. {
  3572.   
  3573.   /* Find all symbols past this point, and make them know
  3574.      what's happened */
  3575.   while (*s) 
  3576.   {
  3577.     asymbol *p = *s;
  3578.     if (p->section == input_section) 
  3579.     {
  3580.       /* This was pointing into this section, so mangle it */
  3581.       if (p->value > value)
  3582.       {
  3583.     p->value -=2;
  3584.       }
  3585.     }
  3586.     s++;
  3587.     
  3588.   }    
  3589. }
  3590. static int 
  3591. DEFUN(movb1,(input_section, symbols, r, shrink),
  3592.       asection *input_section AND
  3593.       asymbol **symbols AND
  3594.       arelent *r AND
  3595.       unsigned int shrink) 
  3596. {
  3597.   bfd_vma value = get_value(r,0);
  3598.     
  3599.   if (value >= 0xff00)
  3600.   { 
  3601.  
  3602.     /* Change the reloc type from 16bit, possible 8 to 8bit
  3603.        possible 16 */
  3604.     r->howto = r->howto + 1;      
  3605.     /* The place to relc moves back by one */
  3606.     r->address -=1;
  3607.       
  3608.     /* This will be two bytes smaller in the long run */
  3609.     shrink +=2 ;
  3610.     perform_slip(symbols, 2, input_section, r->address - shrink +1);
  3611.  
  3612.       
  3613.   }      
  3614.   return shrink;      
  3615. }
  3616.  
  3617. static int 
  3618. DEFUN(jmp1,(input_section, symbols, r, shrink),
  3619.       asection *input_section AND
  3620.       asymbol **symbols AND
  3621.       arelent *r AND
  3622.       unsigned int shrink) 
  3623. {
  3624.  
  3625.   
  3626.   bfd_vma value = get_value(r, 0);
  3627.     
  3628.   bfd_vma dot = input_section->output_section->vma +
  3629.    input_section->output_offset + r->address;    
  3630.   bfd_vma gap;
  3631.   
  3632.   /* See if the address we're looking at within 127 bytes of where
  3633.      we are, if so then we can use a small branch rather than the
  3634.      jump we were going to */
  3635.  
  3636.   gap = value - (dot - shrink);
  3637.   
  3638.  
  3639.   if (-120 < (long)gap && (long)gap < 120 )
  3640.   { 
  3641.  
  3642.     /* Change the reloc type from 16bit, possible 8 to 8bit
  3643.        possible 16 */
  3644.     r->howto = r->howto + 1;      
  3645.     /* The place to relc moves back by one */
  3646.     r->address -=1;
  3647.       
  3648.     /* This will be two bytes smaller in the long run */
  3649.     shrink +=2 ;
  3650.     perform_slip(symbols, 2, input_section, r->address-shrink +1);
  3651.  
  3652.       
  3653.   }      
  3654.   return shrink;      
  3655. }
  3656.  
  3657. static boolean 
  3658. DEFUN(bfd_coff_relax_section,(abfd, i, symbols),
  3659.       bfd *abfd AND
  3660.       asection *i AND
  3661.       asymbol **symbols)
  3662. {
  3663.   
  3664.   /* Get enough memory to hold the stuff */
  3665.   bfd *input_bfd = i->owner;
  3666.   asection *input_section = i;
  3667.   int shrink = 0 ;
  3668.   boolean new = false;
  3669.   
  3670.   bfd_size_type reloc_size = bfd_get_reloc_upper_bound(input_bfd,
  3671.                                input_section);
  3672.   arelent **reloc_vector = (arelent **)bfd_xmalloc(reloc_size);
  3673.  
  3674.   /* Get the relocs and think about them */
  3675.   if (bfd_canonicalize_reloc(input_bfd, 
  3676.                  input_section,
  3677.                  reloc_vector,
  3678.                  symbols))
  3679.   {
  3680.     arelent **parent;
  3681.     for (parent = reloc_vector; *parent; parent++) 
  3682.     {
  3683.       arelent *r = *parent;
  3684.       switch (r->howto->type) {
  3685.     case R_MOVB2:
  3686.     case R_JMP2:
  3687.       
  3688.       shrink+=2;
  3689.       break;
  3690.       
  3691.     case R_MOVB1:
  3692.       shrink = movb1(input_section, symbols, r, shrink);
  3693.       new = true;
  3694.       
  3695.       break;
  3696.     case R_JMP1:
  3697.       shrink = jmp1(input_section, symbols, r, shrink);
  3698.       new = true;
  3699.       
  3700.       break;
  3701.     }
  3702.     }
  3703.  
  3704.   }
  3705.   input_section->_cooked_size -= shrink;  
  3706.   free((char *)reloc_vector);
  3707.   return new;
  3708. }
  3709.  
  3710. static bfd_byte *
  3711. DEFUN(bfd_coff_get_relocated_section_contents,(in_abfd, seclet),
  3712.       bfd *in_abfd AND
  3713.       bfd_seclet_type *seclet)
  3714.  
  3715. {
  3716.   /* Get enough memory to hold the stuff */
  3717.   bfd *input_bfd = seclet->u.indirect.section->owner;
  3718.   asection *input_section = seclet->u.indirect.section;
  3719.   bfd_byte  *data = (bfd_byte *)malloc(input_section->_raw_size);
  3720.   bfd_size_type reloc_size = bfd_get_reloc_upper_bound(input_bfd,
  3721.                                input_section);
  3722.   arelent **reloc_vector = (arelent **)bfd_xmalloc(reloc_size);
  3723.   
  3724.   /* read in the section */
  3725.   bfd_get_section_contents(input_bfd,
  3726.                input_section,
  3727.                data,
  3728.                0,
  3729.                input_section->_raw_size);
  3730.   
  3731.   
  3732.   if (bfd_canonicalize_reloc(input_bfd, 
  3733.                  input_section,
  3734.                  reloc_vector,
  3735.                  seclet->u.indirect.symbols) )
  3736.   {
  3737.     arelent **parent = reloc_vector;
  3738.     arelent *reloc ;
  3739.     
  3740.  
  3741.  
  3742.     unsigned int dst_address = 0;
  3743.     unsigned int src_address = 0;
  3744.     unsigned int run;
  3745.     unsigned int idx;
  3746.     
  3747.     /* Find how long a run we can do */
  3748.     while (dst_address < seclet->size) 
  3749.     {
  3750.       
  3751.       reloc = *parent;
  3752.       if (reloc) 
  3753.       {
  3754.     /* Note that the relaxing didn't tie up the addresses in the
  3755.        relocation, so we use the original address to work out the
  3756.        run of non-relocated data */
  3757.     run = reloc->address - src_address;
  3758.     parent++;
  3759.     
  3760.       }
  3761.       else 
  3762.       {
  3763.     run = seclet->size - dst_address;
  3764.       }
  3765.       /* Copy the bytes */
  3766.       for (idx = 0; idx < run; idx++)
  3767.       {
  3768.     data[dst_address++] = data[src_address++];
  3769.       }
  3770.     
  3771.       /* Now do the relocation */
  3772.     
  3773.       if (reloc) 
  3774.       {
  3775.     switch (reloc->howto->type) 
  3776.     {
  3777.     case R_JMP2:
  3778.       /* Speciial relaxed type */
  3779.     {
  3780.       bfd_vma dot = seclet->offset + dst_address + seclet->u.indirect.section->output_section->vma;      
  3781.       int   gap = get_value(reloc,seclet)-dot-1;
  3782.       if ((gap & ~0xff  ) != 0 &&((gap & 0xff00)!= 0xff00)) abort();
  3783.  
  3784.       bfd_put_8(in_abfd,gap,   data+dst_address);
  3785.  
  3786.       switch (data[dst_address-1]) 
  3787.       {
  3788.         
  3789.       case 0x5e:
  3790.         /* jsr -> bsr */
  3791.         bfd_put_8(in_abfd, 0x55, data+dst_address-1);
  3792.         break;
  3793.       case 0x5a:     
  3794.         /* jmp ->bra */
  3795.         bfd_put_8(in_abfd, 0x40, data+dst_address-1);
  3796.         break;
  3797.       
  3798.       default:
  3799.         abort();
  3800.       
  3801.       }
  3802.     
  3803.     
  3804.  
  3805.          
  3806.       dst_address++;
  3807.       src_address+=3;
  3808.   
  3809.       break;
  3810.     }
  3811.  
  3812.          
  3813.     case R_MOVB2:
  3814.       /* Special relaxed type, there will be a gap between where we
  3815.          get stuff from and where we put stuff to now 
  3816.          
  3817.          for a mov.b @aa:16 -> mov.b @aa:8
  3818.          opcode 0x6a 0x0y offset
  3819.          ->     0x2y off
  3820.          */
  3821.       if (data[dst_address-1] != 0x6a)
  3822.        abort();
  3823.       switch (data[dst_address] & 0xf0) 
  3824.       {
  3825.       case 0x00:
  3826.         /* Src is memory */
  3827.         data[dst_address-1] = (data[src_address] & 0xf) | 0x20;
  3828.         break;
  3829.       case 0x80:
  3830.         /* Src is reg */
  3831.         data[dst_address-1] = (data[src_address] & 0xf) | 0x30;
  3832.         break;
  3833.       default:
  3834.         abort();
  3835.       }
  3836.     
  3837.       /* the offset must fit ! after all, what was all the relaxing
  3838.          about ? */
  3839.  
  3840.       bfd_put_8(in_abfd, get_value(reloc, seclet), data + dst_address);
  3841.  
  3842.       /* Note the magic - src goes up by two bytes, but dst by only
  3843.          one */
  3844.       dst_address+=1;
  3845.       src_address+=3;
  3846.     
  3847.       break;
  3848.       /* PCrel 8 bits */
  3849.     case R_PCRBYTE:      
  3850.     {
  3851.       bfd_vma dot = seclet->offset + dst_address + seclet->u.indirect.section->output_section->vma;      
  3852.       int   gap = get_value(reloc,seclet)-dot;
  3853.       if (gap > 127 || gap < -128) 
  3854.       {
  3855.         bfd_error_vector.reloc_value_truncated(reloc, seclet);
  3856.       }
  3857.       
  3858.       bfd_put_8(in_abfd,gap,   data+dst_address);
  3859.       dst_address++;
  3860.       src_address++;
  3861.   
  3862.       break;
  3863.     }
  3864.  
  3865.     case R_RELBYTE:
  3866.     {
  3867.       unsigned  int gap =get_value(reloc,seclet);
  3868.       if (gap > 256)
  3869.       {
  3870.         bfd_error_vector.reloc_value_truncated(reloc, seclet);
  3871.       }
  3872.       
  3873.       bfd_put_8(in_abfd, gap, data+dst_address);
  3874.       dst_address+=1;
  3875.       src_address+=1;
  3876.  
  3877.  
  3878.     }
  3879.       break; 
  3880.     case R_JMP1:
  3881.       /* A relword which would have like to have been a pcrel */
  3882.     case R_MOVB1:    
  3883.       /* A relword which would like to have been modified but
  3884.          didn't make it */
  3885.     case R_RELWORD:
  3886.       bfd_put_16(in_abfd, get_value(reloc,seclet), data+dst_address);
  3887.       dst_address+=2;
  3888.       src_address+=2;
  3889.       break;
  3890.     
  3891.     default:
  3892.       abort();
  3893.     }
  3894.       }    
  3895.     }
  3896.   }
  3897.   free((char *)reloc_vector);
  3898.   return data;
  3899.   
  3900. }
  3901.  
  3902.  
  3903. #define coff_core_file_failing_command    _bfd_dummy_core_file_failing_command
  3904. #define coff_core_file_failing_signal    _bfd_dummy_core_file_failing_signal
  3905. #define coff_core_file_matches_executable_p    _bfd_dummy_core_file_matches_executable_p
  3906. #define coff_slurp_armap        bfd_slurp_coff_armap
  3907. #define coff_slurp_extended_name_table    _bfd_slurp_extended_name_table
  3908. #define coff_truncate_arname        bfd_dont_truncate_arname
  3909. #define coff_openr_next_archived_file    bfd_generic_openr_next_archived_file
  3910. #define coff_generic_stat_arch_elt    bfd_generic_stat_arch_elt
  3911. #define    coff_get_section_contents    bfd_generic_get_section_contents
  3912. #define    coff_close_and_cleanup        bfd_generic_close_and_cleanup
  3913.  
  3914. #define coff_bfd_debug_info_start        bfd_void
  3915. #define coff_bfd_debug_info_end        bfd_void
  3916. #define coff_bfd_debug_info_accumulate    (PROTO(void,(*),(bfd*, struct sec *))) bfd_void
  3917. #define coff_bfd_get_relocated_section_contents  bfd_generic_get_relocated_section_contents
  3918. #define coff_bfd_relax_section bfd_generic_relax_section
  3919.  
  3920.